运算符
在 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 被初始化了,但未定义。
||, or
||/or 短路的机制是返回第一个真值表达式的结果。
一些例子
(1 + 2) || true || "string" #=> 3 false || nil || "string" #=> "string"