- Ruby 基礎
- Ruby - 首頁
- Ruby - 概述
- Ruby - 環境設定
- Ruby - 語法
- Ruby - 類和物件
- Ruby - 變數
- Ruby - 運算子
- Ruby - 註釋
- Ruby - IF...ELSE
- Ruby - 迴圈
- Ruby - 方法
- Ruby - 程式碼塊
- Ruby - 模組
- Ruby - 字串
- Ruby - 陣列
- Ruby - 雜湊表
- Ruby - 日期和時間
- Ruby - 範圍
- Ruby - 迭代器
- Ruby - 檔案 I/O
- Ruby - 異常
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? | 如果接收者和引數具有相同的型別和相等的值,則為真。 | 1 == 1.0 返回 true,但 1.eql?(1.0) 為 false。 |
| equal? | 如果接收者和引數具有相同的物件 ID,則為真。 | 如果 aObj 是 bObj 的副本,則 aObj == bObj 為真,a.equal?bObj 為假,但 a.equal?aObj 為真。 |
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 |
| ^ | 二進位制 XOR 運算子如果位在一個運算元中設定,但在另一個運算元中未設定,則將其複製。 | (a ^ b) 將得到 49,即 0011 0001 |
| ~ | 二進位制一補碼運算子是一元的,其作用是“翻轉”位。 | (~a ) 將得到 -61,由於帶符號二進位制數,因此以 2 的補碼形式表示為 1100 0011。 |
| << | 二進位制左移運算子。左運算元的值向左移動由右運算元指定的位數。 | a << 2 將得到 240,即 1111 0000 |
| >> | 二進位制右移運算子。左運算元的值向右移動由右運算元指定的位數。 | a >> 2 將得到 15,即 0000 1111 |
Ruby 邏輯運算子
Ruby 語言支援以下邏輯運算子
假設變數 a 為 10,變數 b 為 20,則 −
| 運算子 | 描述 | 示例 |
|---|---|---|
| and | 稱為邏輯 AND 運算子。如果兩個運算元都為真,則條件為真。 | (a and b) 為真。 |
| or | 稱為邏輯 OR 運算子。如果兩個運算元中的任何一個非零,則條件為真。 | (a or b) 為真。 |
| && | 稱為邏輯 AND 運算子。如果兩個運算元都非零,則條件為真。 | (a && b) 為真。 |
| || | 稱為邏輯 OR 運算子。如果兩個運算元中的任何一個非零,則條件為真。 | (a || b) 為真。 |
| ! | 稱為邏輯 NOT 運算子。用於反轉其運算元的邏輯狀態。如果條件為真,則邏輯 NOT 運算子將使其為假。 | !(a && b) 為假。 |
| not | 稱為邏輯 NOT 運算子。用於反轉其運算元的邏輯狀態。如果條件為真,則邏輯 NOT 運算子將使其為假。 | not(a && b) 為假。 |
Ruby 三元運算子
還有一個稱為三元運算子的運算子。它首先評估表示式的真假值,然後根據評估結果執行兩個給定語句中的一個。條件運算子具有以下語法 −
| 運算子 | 描述 | 示例 |
|---|---|---|
| ? : | 條件表示式 | 如果條件為真 ? 則為值 X : 否則為值 Y |
Ruby 範圍運算子
Ruby 中的序列範圍用於建立一系列連續的值 - 由起始值、結束值和介於兩者之間的值範圍組成。
在 Ruby 中,這些序列是使用 ".." 和 "..." 範圍運算子建立的。兩點形式建立包含範圍,而三點形式建立排除指定高值的範圍。
| 運算子 | 描述 | 示例 |
|---|---|---|
| .. | 建立從起點到終點(包括終點)的範圍。 | 1..10 建立從 1 到 10(包括 10)的範圍。 |
| ... | 建立從起點到終點(不包括終點)的範圍。 | 1...10 建立從 1 到 9 的範圍。 |
Ruby defined? 運算子
defined? 是一個特殊的運算子,它採用方法呼叫的形式來確定傳遞的表示式是否已定義。它返回表示式的描述字串,如果表示式未定義則返回 nil。
defined? 運算子有多種用法
用法 1
defined? variable # True if variable is initialized
例如
foo = 42 defined? foo # => "local-variable" defined? $_ # => "global-variable" defined? bar # => nil (undefined)
用法 2
defined? method_call # True if a method is defined
例如
defined? puts # => "method" defined? puts(bar) # => nil (bar is not defined here) defined? unpack # => nil (not defined here)
用法 3
# True if a method exists that can be called with super user defined? super
例如
defined? super # => "super" (if it can be called) defined? super # => nil (if it cannot be)
用法 4
defined? yield # True if a code block has been passed
例如
defined? yield # => "yield" (if there is a block passed) defined? yield # => nil (if there is no block)
Ruby 點 "." 和雙冒號 "::" 運算子
透過在模組方法名稱前加上模組名稱和句點來呼叫模組方法,並使用模組名稱和兩個冒號來引用常量。
:: 是一元運算子,它允許:在類或模組內定義的常量、例項方法和類方法從類或模組外部的任何位置訪問。
請記住 在 Ruby 中,類和方法也可以被視為常量。
您只需要將 :: Const_name 與返回相應類或模組物件的表示式一起使用即可。
如果沒有使用字首表示式,則預設使用主 Object 類。
以下兩個示例 −
MR_COUNT = 0 # constant defined on main Object class module Foo MR_COUNT = 0 ::MR_COUNT = 1 # set global count to 1 MR_COUNT = 2 # set local count to 2 end puts MR_COUNT # this is the global constant puts Foo::MR_COUNT # this is the local "Foo" constant
第二個示例
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 | 邏輯組合 |
注意 − 方法列中為“是”的運算子實際上是方法,因此可以被重寫。