Ruby 運算符
Ruby 支持一套豐富的運算符。 大多數運算符實際上是方法調用。 例如,a + b 被解釋為a.+(b),其中指向變量a 的+ 方法被調用,b 作為方法調用的參數。
對於每個運算符(+ - * / % ** & | ^ << >> && ||),都有一個相對應的縮寫賦值運算符(+= -= 等等)。
Ruby 算術運算符
假設變量a 的值為10,變量b 的值為20,那麼:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加法 - 把运算符两边的操作数相加 | a + b 将得到 30 |
- | 减法 - 把左操作数减去右操作数 | a - b 将得到 -10 |
* | 乘法 - 把运算符两边的操作数相乘 | a * b 将得到 200 |
/ | 除法 - 把左操作数除以右操作数 | b / a 将得到 2 |
% | 求模 - 把左操作数除以右操作数,返回余数 | b % a 将得到 0 |
** | 指数 - 执行指数计算 | a**b 将得到 10 的 20 次方 |
Ruby 比較運算符
假設變量a 的值為10,變量b 的值為20,那麼:
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (a == b) 不为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (a != b) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (a > b) 不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (a < b) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (a >= b) 不为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (a <= b) 为真。 |
<=> | 联合比较运算符。如果第一个操作数等于第二个操作数则返回 0,如果第一个操作数大于第二个操作数则返回 1,如果第一个操作数小于第二个操作数则返回 -1。 | (a <=> b) 返回 -1。 |
=== | 用于测试case语句的 when 子句内的相等。 | (1...10) === 5 返回 true。 |
.eql? | 如果接收器和参数具有相同的类型和相等的值,则返回 true。 | 1 == 1.0 返回 true,但是 1.eql?(1.0) 返回 false。 |
equal? | 如果接收器和参数具有相同的对象 id,则返回 true。 | 如果 aObj 是 bObj 的副本,那么 aObj == bObj 返回 true,a.equal?bObj 返回 false,但是 a.equal?aObj 返回 true。 |
Ruby 賦值運算符
假設變量a 的值為10,變量b 的值為20,那麼:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右操作数的值赋给左操作数 | c = a + b 将把 a + b 的值赋给 c |
+= | 加且赋值运算符,把右操作数加上左操作数的结果赋值给左操作数 | c += a 相当于 c = c + a |
-= | 减且赋值运算符,把左操作数减去右操作数的结果赋值给左操作数 | c -= a 相当于 c = c - a |
*= | 乘且赋值运算符,把右操作数乘以左操作数的结果赋值给左操作数 | c *= a 相当于 c = c * a |
/= | 除且赋值运算符,把左操作数除以右操作数的结果赋值给左操作数 | c /= a 相当于 c = c / a |
%= | 求模且赋值运算符,求两个操作数的模赋值给左操作数 | c %= a 相当于 c = c % a |
**= | 指数且赋值运算符,执行指数计算,并赋值给左操作数 | c **= a 相当于 c = c ** a |
Ruby 並行賦值
Ruby 也支持變量的並行賦值。 這使得多個變量可以通過一行的Ruby 代碼進行初始化。 例如:
a = 10 b = 20 c = 30
使用並行賦值可以更快地聲明:
a, b, c = 10, 20, 30
並行賦值在交換兩個變量的值時也很有用:
a, b = b, c
Ruby 位運算符
位運算符作用於位,並逐位執行操作。
假設如果a = 60,且b = 13,現在以二進制格式,它們如下所示:
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
下表列出了Ruby 支持的位運算符。
運算符 | 描述 | 實例 |
---|---|---|
& | 如果同時存在於兩個操作數中,二進制AND 運算符複製一位到結果中。 | (a & b) 將得到12,即為0000 1100 |
| | 如果存在於任一操作數中,二進制OR 運算符複製一位到結果中。 | (a | b) 將得到61,即為0011 1101 |
^ | 如果存在於其中一個操作數中但不同時存在於兩個操作數中,二進制異或運算符複製一位到結果中。 | (a ^ b) 將得到49,即為0011 0001 |
~ | 二進制補碼運算符是一元運算符,具有"翻轉"位效果。 | (~a ) 將得到-61,即為1100 0011,2 的補碼形式,帶符號的二進制數。 |
<< | 二進制左移運算符。 左操作數的值向左移動右操作數指定的位數。 | a << 2 將得到240,即為1111 0000 |
>> | 二進制右移運算符。 左操作數的值向右移動右操作數指定的位數。 | a >> 2 將得到15,即為0000 1111 |
Ruby 邏輯運算符
下表列出了Ruby 支持的邏輯運算符。
假設變量a 的值為10,變量b 的值為20,那麼:
运算符 | 描述 | 实例 |
---|---|---|
and | 称为逻辑与运算符。如果两个操作数都为真,则条件为真。 | (a and b) 为真。 |
or | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (a or b) 为真。 |
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (a && b) 为真。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (a || b) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(a && b) 为假。 |
not | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | not(a && b) 为假。 |
Ruby 三元運算符
有一個以上的操作稱為三元運算符。 第一個計算表達式的真假值,然後根據這個結果決定執行後邊兩個語句中的一個。 條件運算符的語法如下:
运算符 | 描述 | 实例 |
---|---|---|
? : | 条件表达式 | 如果条件为真 ? 则值为 X : 否则值为 Y |
Ruby 範圍運算符
在Ruby 中,序列範圍用於創建一系列連續的值- 包含起始值、結束值(視情況而定)和它們之間的值。
在Ruby 中,這些序列是使用".." 和"..." 範圍運算符來創建的。 兩點形式創建的範圍包含起始值和結束值,三點形式創建的範圍只包含起始值不包含結束值。
运算符 | 描述 | 实例 |
---|---|---|
.. | 创建一个从开始点到结束点的范围(包含结束点) | 1..10 创建从 1 到 10 的范围 |
... | 创建一个从开始点到结束点的范围(不包含结束点) | 1...10 创建从 1 到 9 的范围 |
Ruby defined? 運算符
defined? 是一個特殊的運算符,以方法調用的形式來判斷傳遞的表達式是否已定義。 它返回表達式的描述字符串,如果表達式未定義則返回nil 。
下面是defined? 運算符的各種用法:
用法1
defined? variable # 如果variable 已經初始化,則為True
例如:
foo = 42 defined? foo # => "local-variable" defined? $_ # => "global-variable" defined? bar # => nil(未定義)
用法2
defined? method_call # 如果方法已經定義,則為True
例如:
defined? puts # => "method" defined? puts(bar) # => nil(在這裡bar 未定義) defined? unpack # => nil(在這裡未定義)
用法3
# 如果存在可被super 用戶調用的方法,則為True defined? super
例如:
defined? super # => "super"(如果可被調用) defined? super # => nil(如果不可被調用)
用法4
defined? yield # 如果已傳遞代碼塊,則為True
例如:
defined? yield # => "yield"(如果已傳遞塊) defined? yield # => nil(如果未傳遞塊)
Ruby 點運算符"." 和雙冒號運算符"::"
您可以通過在方法名稱前加上模塊名稱和一條下劃線來調用模塊方法。 您可以使用模塊名稱和兩個冒號來引用一個常量。
::是一元運算符,允許在類或模塊內定義常量、實例方法和類方法,可以從類或模塊外的任何地方進行訪問。
請記住:在Ruby中,類和方法也可以被當作常量。
您只需要在表達式的常量名前加上::前綴,即可返回適當的類或模塊對象。
如果未使用前綴表達式,則默認使用主Object 類。
下面是兩個實例:
MR_COUNT = 0 # 定義在主Object 類上的常量module Foo MR_COUNT = 0 ::MR_COUNT = 1 # 設置全局計數為1 MR_COUNT = 2 # 設置局部計數為2 end puts MR_COUNT # 這是全局常量puts Foo::MR_COUNT # 這是"Foo" 的局部常量
第二個實例:
CONST = ' out there' class Inside_one CONST = proc {' in there'} def where_is_my_CONST ::CONST + ' inside one' end end class Inside_two CONST = ' inside two' def where_is_my_CONST CONST end end puts Inside_one.new.where_is_my_CONST puts Inside_two.new.where_is_my_CONST puts Object::CONST + Inside_two::CONST puts Inside_two::CONST + CONST puts Inside_one::CONST puts Inside_one::CONST.call + Inside_two::CONST
Ruby 運算符的優先級
下表按照運算符的優先級從高到低列出了所有的運算符。
方法 | 运算符 | 描述 |
---|---|---|
是 | :: | 常量解析运算符 |
是 | [ ] [ ]= | 元素引用、元素集合 |
是 | ** | 指数 |
是 | ! ~ + - | 非、补、一元加、一元减(最后两个的方法名为 +@ 和 -@) |
是 | * / % | 乘法、除法、求模 |
是 | + - | 加法和减法 |
是 | >> << | 位右移、位左移 |
是 | & | 位与 |
是 | ^ | | 位异或、位或 |
是 | <= < > >= | 比较运算符 |
是 | <=> == === != =~ !~ | 相等和模式匹配运算符(!= 和 !~ 不能被定义为方法) |
&& | 逻辑与 | |
|| | 逻辑或 | |
.. ... | 范围(包含、不包含) | |
? : | 三元 if-then-else | |
= %= { /= -= += |= &= >>= <<= *= &&= ||= **= | 赋值 | |
defined? | 检查指定符号是否已定义 | |
not | 逻辑否定 | |
or and | 逻辑组成 |
注意:在方法列標識為是的運算符實際上是方法,因此可以被重載。