- 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 | 逻辑组合 |
注意 − 方法列中为“是”的运算符实际上是方法,因此可以被重写。