Ruby 支持一套豐富的運(yùn)算符。大多數(shù)運(yùn)算符實(shí)際上是方法調(diào)用。例如,a + b 被解釋為 a.+(b),其中指向變量 a 的 + 方法被調(diào)用,b 作為方法調(diào)用的參數(shù)。
對(duì)于每個(gè)運(yùn)算符(+ - * / % ** & | ^ << >> && ||),都有一個(gè)相對(duì)應(yīng)的縮寫(xiě)賦值運(yùn)算符(+= -= 等等)。
假設(shè)變量 a 的值為 10,變量 b 的值為 20,那么:
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
+ | 加法 - 把運(yùn)算符兩邊的操作數(shù)相加 | a + b 將得到 30 |
- | 減法 - 把左操作數(shù)減去右操作數(shù) | a - b 將得到 -10 |
乘法 - 把運(yùn)算符兩邊的操作數(shù)相乘 | a b 將得到 200 | |
/ | 除法 - 把左操作數(shù)除以右操作數(shù) | b / a 將得到 2 |
% | 求模 - 把左操作數(shù)除以右操作數(shù),返回余數(shù) | b % a 將得到 0 |
指數(shù) - 執(zhí)行指數(shù)計(jì)算 | ab 將得到 10 的 20 次方 |
假設(shè)變量 a 的值為 10,變量 b 的值為 20,那么:
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
== | 檢查兩個(gè)操作數(shù)的值是否相等,如果相等則條件為真。 | (a == b) 不為真。 |
!= | 檢查兩個(gè)操作數(shù)的值是否相等,如果不相等則條件為真。 | (a != b) 為真。 |
> | 檢查左操作數(shù)的值是否大于右操作數(shù)的值,如果是則條件為真。 | (a > b) 不為真。 |
< | 檢查左操作數(shù)的值是否小于右操作數(shù)的值,如果是則條件為真。 | (a < b) 為真。 |
>= | 檢查左操作數(shù)的值是否大于或等于右操作數(shù)的值,如果是則條件為真。 | (a >= b) 不為真。 |
<= | 檢查左操作數(shù)的值是否小于或等于右操作數(shù)的值,如果是則條件為真。 | (a <= b) 為真。 |
<=> | 聯(lián)合比較運(yùn)算符。如果第一個(gè)操作數(shù)等于第二個(gè)操作數(shù)則返回 0,如果第一個(gè)操作數(shù)大于第二個(gè)操作數(shù)則返回 1,如果第一個(gè)操作數(shù)小于第二個(gè)操作數(shù)則返回 -1。 | (a <=> b) 返回 -1。 |
=== | 用于測(cè)試 case 語(yǔ)句的 when 子句內(nèi)的相等。 | (1...10) === 5 返回 true。 |
.eql? | 如果接收器和參數(shù)具有相同的類(lèi)型和相等的值,則返回 true。 | 1 == 1.0 返回 true,但是 1.eql?(1.0) 返回 false。 |
equal? | 如果接收器和參數(shù)具有相同的對(duì)象 id,則返回 true。 | 如果 aObj 是 bObj 的副本,那么 aObj == bObj 返回 true,a.equal?bObj 返回 false,但是 a.equal?aObj 返回 true。 |
假設(shè)變量 a 的值為 10,變量 b 的值為 20,那么:
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
= | 簡(jiǎn)單的賦值運(yùn)算符,把右操作數(shù)的值賦給左操作數(shù) | c = a + b 將把 a + b 的值賦給 c |
+= | 加且賦值運(yùn)算符,把右操作數(shù)加上左操作數(shù)的結(jié)果賦值給左操作數(shù) | c += a 相當(dāng)于 c = c + a |
-= | 減且賦值運(yùn)算符,把左操作數(shù)減去右操作數(shù)的結(jié)果賦值給左操作數(shù) | c -= a 相當(dāng)于 c = c - a |
= | 乘且賦值運(yùn)算符,把右操作數(shù)乘以左操作數(shù)的結(jié)果賦值給左操作數(shù) | c = a 相當(dāng)于 c = c * a |
/= | 除且賦值運(yùn)算符,把左操作數(shù)除以右操作數(shù)的結(jié)果賦值給左操作數(shù) | c /= a 相當(dāng)于 c = c / a |
%= | 求模且賦值運(yùn)算符,求兩個(gè)操作數(shù)的模賦值給左操作數(shù) | c %= a 相當(dāng)于 c = c % a |
= | 指數(shù)且賦值運(yùn)算符,執(zhí)行指數(shù)計(jì)算,并賦值給左操作數(shù) | c = a 相當(dāng)于 c = c ** a |
Ruby 也支持變量的并行賦值。這使得多個(gè)變量可以通過(guò)一行的 Ruby 代碼進(jìn)行初始化。例如:
a = 10
b = 20
c = 30
使用并行賦值可以更快地聲明:
a, b, c = 10, 20, 30
并行賦值在交換兩個(gè)變量的值時(shí)也很有用:
a, b = b, c
位運(yùn)算符作用于位,并逐位執(zhí)行操作。
假設(shè)如果 a = 60,且 b = 13,現(xiàn)在以二進(jìn)制格式,它們?nèi)缦滤荆?/p>
a = 0011 1100
b = 0000 1101
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
下表列出了 Ruby 支持的位運(yùn)算符。
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
& | 如果同時(shí)存在于兩個(gè)操作數(shù)中,二進(jìn)制 AND 運(yùn)算符復(fù)制一位到結(jié)果中。 | (a & b) 將得到 12,即為 0000 1100 |
| | 如果存在于任一操作數(shù)中,二進(jìn)制 OR 運(yùn)算符復(fù)制一位到結(jié)果中。 | (a | b) 將得到 61,即為 0011 1101 |
^ | 如果存在于其中一個(gè)操作數(shù)中但不同時(shí)存在于兩個(gè)操作數(shù)中,二進(jìn)制異或運(yùn)算符復(fù)制一位到結(jié)果中。 | (a ^ b) 將得到 49,即為 0011 0001 |
~ | 二進(jìn)制補(bǔ)碼運(yùn)算符是一元運(yùn)算符,具有"翻轉(zhuǎn)"位效果。 | (~a ) 將得到 -61,即為 1100 0011,2 的補(bǔ)碼形式,帶符號(hào)的二進(jìn)制數(shù)。 |
二進(jìn)制左移運(yùn)算符。左操作數(shù)的值向左移動(dòng)右操作數(shù)指定的位數(shù)。 | a | |
>> | 二進(jìn)制右移運(yùn)算符。左操作數(shù)的值向右移動(dòng)右操作數(shù)指定的位數(shù)。 | a >> 2 將得到 15,即為 0000 1111 |
下表列出了 Ruby 支持的邏輯運(yùn)算符。
假設(shè)變量 a 的值為 10,變量 b 的值為 20,那么:
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
and | 稱(chēng)為邏輯與運(yùn)算符。如果兩個(gè)操作數(shù)都為真,則條件為真。 | (a and b) 為真。 |
or | 稱(chēng)為邏輯或運(yùn)算符。如果兩個(gè)操作數(shù)中有任意一個(gè)非零,則條件為真。 | (a or b) 為真。 |
&& | 稱(chēng)為邏輯與運(yùn)算符。如果兩個(gè)操作數(shù)都非零,則條件為真。 | (a && b) 為真。 |
|| | 稱(chēng)為邏輯或運(yùn)算符。如果兩個(gè)操作數(shù)中有任意一個(gè)非零,則條件為真。 | (a || b) 為真。 |
! | 稱(chēng)為邏輯非運(yùn)算符。用來(lái)逆轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為真則邏輯非運(yùn)算符將使其為假。 | !(a && b) 為假。 |
not | 稱(chēng)為邏輯非運(yùn)算符。用來(lái)逆轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為真則邏輯非運(yùn)算符將使其為假。 | not(a && b) 為假。 |
有一個(gè)以上的操作稱(chēng)為三元運(yùn)算符。第一個(gè)計(jì)算表達(dá)式的真假值,然后根據(jù)這個(gè)結(jié)果決定執(zhí)行后邊兩個(gè)語(yǔ)句中的一個(gè)。條件運(yùn)算符的語(yǔ)法如下:
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
? : | 條件表達(dá)式 | 如果條件為真 ? 則值為 X : 否則值為 Y |
在 Ruby 中,序列范圍用于創(chuàng)建一系列連續(xù)的值 - 包含起始值、結(jié)束值(視情況而定)和它們之間的值。
在 Ruby 中,這些序列是使用 ".." 和 "..." 范圍運(yùn)算符來(lái)創(chuàng)建的。兩點(diǎn)形式創(chuàng)建的范圍包含起始值和結(jié)束值,三點(diǎn)形式創(chuàng)建的范圍只包含起始值不包含結(jié)束值。
運(yùn)算符 | 描述 | 實(shí)例 |
---|---|---|
.. | 創(chuàng)建一個(gè)從開(kāi)始點(diǎn)到結(jié)束點(diǎn)的范圍(包含結(jié)束點(diǎn)) | 1..10 創(chuàng)建從 1 到 10 的范圍 |
... | 創(chuàng)建一個(gè)從開(kāi)始點(diǎn)到結(jié)束點(diǎn)的范圍(不包含結(jié)束點(diǎn)) | 1...10 創(chuàng)建從 1 到 9 的范圍 |
defined? 是一個(gè)特殊的運(yùn)算符,以方法調(diào)用的形式來(lái)判斷傳遞的表達(dá)式是否已定義。它返回表達(dá)式的描述字符串,如果表達(dá)式未定義則返回 nil。
下面是 defined? 運(yùn)算符的各種用法:
defined? variable # 如果 variable 已經(jīng)初始化,則為 True
例如:
foo = 42
defined? foo # => "local-variable"
defined? $_ # => "global-variable"
defined? bar # => nil(未定義)
defined? method_call # 如果方法已經(jīng)定義,則為 True
例如:
defined? puts # => "method"
defined? puts(bar) # => nil(在這里 bar 未定義)
defined? unpack # => nil(在這里未定義)
# 如果存在可被 super 用戶(hù)調(diào)用的方法,則為 True
defined? super
例如:
defined? super # => "super"(如果可被調(diào)用)
defined? super # => nil(如果不可被調(diào)用)
defined? yield # 如果已傳遞代碼塊,則為 True
例如:
defined? yield # => "yield"(如果已傳遞塊)
defined? yield # => nil(如果未傳遞塊)
您可以通過(guò)在方法名稱(chēng)前加上模塊名稱(chēng)和一條下劃線來(lái)調(diào)用模塊方法。您可以使用模塊名稱(chēng)和兩個(gè)冒號(hào)來(lái)引用一個(gè)常量。
:: 是一元運(yùn)算符,允許在類(lèi)或模塊內(nèi)定義常量、實(shí)例方法和類(lèi)方法,可以從類(lèi)或模塊外的任何地方進(jìn)行訪問(wèn)。
請(qǐng)記?。?/strong>在 Ruby 中,類(lèi)和方法也可以被當(dāng)作常量。
您只需要在表達(dá)式的常量名前加上 :: 前綴,即可返回適當(dāng)?shù)念?lèi)或模塊對(duì)象。
如果未使用前綴表達(dá)式,則默認(rèn)使用主 Object 類(lèi)。
下面是兩個(gè)實(shí)例:
MR_COUNT = 0 # 定義在主 Object 類(lèi)上的常量
module Foo
MR_COUNT = 0
::MR_COUNT = 1 # 設(shè)置全局計(jì)數(shù)為 1
MR_COUNT = 2 # 設(shè)置局部計(jì)數(shù)為 2
end
puts MR_COUNT # 這是全局常量
puts Foo::MR_COUNT # 這是 "Foo" 的局部常量
第二個(gè)實(shí)例:
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
下表按照運(yùn)算符的優(yōu)先級(jí)從高到低列出了所有的運(yùn)算符。
方法 | 運(yùn)算符 | 描述 |
---|---|---|
是 | :: | 常量解析運(yùn)算符 |
是 | [ ] [ ]= | 元素引用、元素集合 |
是 | 指數(shù) | |
是 | ! ~ + - | 非、補(bǔ)、一元加、一元減(最后兩個(gè)的方法名為 +@ 和 -@) |
是 | / % | 乘法、除法、求模 |
是 | + - | 加法和減法 |
是 | >> << | 位右移、位左移 |
是 | & | 位與 |
是 | ^ | | 位異或、位或 |
是 | <= < > >= | 比較運(yùn)算符 |
是 | <=> == === != =~ !~ | 相等和模式匹配運(yùn)算符(!= 和 !~ 不能被定義為方法) |
&& | 邏輯與 | |
|| | 邏輯或 | |
.. ... | 范圍(包含、不包含) | |
? : | 三元 if-then-else | |
= %= { /= -= += |= &= >>= <<= = &&= ||= = | 賦值 | |
defined? | 檢查指定符號(hào)是否已定義 | |
not | 邏輯否定 | |
or and | 邏輯組成 |
注意:在方法列標(biāo)識(shí)為 是 的運(yùn)算符實(shí)際上是方法,因此可以被重載。
更多建議: