运算符¶ ↑
在 Ruby 中,运算符(例如 +
)被定义为类中的方法。 字面量 在较低级别的 C 语言中定义其方法。例如,String
类。
Ruby 对象可以定义或重载它们自己对大多数运算符的实现。
以下是一个示例
class Foo < String def +(str) self.concat(str).concat("another string") end end foobar = Foo.new("test ") puts foobar + "baz "
这将打印
test baz another string
可用的运算符取决于实现的类。
运算符行为¶ ↑
类对给定运算符的行为是特定于该类的,因为运算符是方法实现。
在使用运算符时,是操作左侧的表达式指定了行为。
'a' * 3 #=> "aaa" 3 * 'a' # TypeError: String can't be coerced into Integer
逻辑运算符¶ ↑
逻辑运算符不是方法,因此无法重新定义/重载。它们在较低级别被标记化。
短路逻辑运算符(&&
、||
、and
和 or
)并不总是产生布尔值。类似于块,它是最后求值表达式定义运算结果。
&&
、and
¶ ↑
&&
/and
运算符都通过从左到右执行运算符的每一侧,并在首次出现假值表达式时停止,从而提供短路。定义结果的表达式是最后执行的表达式,无论是最终表达式还是首次出现假值表达式。
一些示例
true && 9 && "string" #=> "string" (1 + 2) && nil && "string" #=> nil (a = 1) && (b = false) && (c = "string") #=> false puts a #=> 1 puts b #=> false puts c #=> nil
在最后一个示例中,初始化了 c
,但未定义 c
。
||
、or
¶ ↑
||
/or
短路的方式是返回第一个真值表达式的结果。
一些示例
(1 + 2) || true || "string" #=> 3 false || nil || "string" #=> "string"