我们可以覆盖 Ruby 中的运算符吗?
Can we override operators in Ruby?
在某种情况下...例如
(10 + 20) * 10
=> 300
括号中的表达式片段在更高优先级之前被评估 multiplication.So 它是否适用于其他运算符,因为 well.Can 我覆盖其他运算符,例如 << !
...等等
是的,你可以这样做
class String
def << str
self + "*" + str
end
end
puts "str" << "sss"
当人们评估表达式时,他们通常会从表达式的左侧开始,然后向右移动。例如,从左到右计算,我们从以下表达式得到结果 300:
10 + 20 * 10 = 300
这是因为我们作为人类,将 10
添加到 20
,得到 30
,然后乘以 10
得到 300
.让 Ruby 执行相同的计算,您会得到截然不同的答案:
> 10 + 20 * 10
=> 210
这是运算符优先级的直接结果。 Ruby 有一组规则告诉它应该在表达式中计算运算符的顺序。显然,Ruby 认为乘法运算符 (*) 的优先级高于加法运算符 (+)。
覆盖运算符优先级
内置于Ruby中的优先级可以通过用括号括起表达式的较低优先级部分来覆盖。例如:
> (10 + 20) * 10
=> 300
在上面的示例中,括号中的表达式片段在更高优先级乘法之前进行计算。
有关更多信息,请参阅:
- http://rubysnippets.com/2013/01/25/operator-overloading-in-ruby/
- Override == operator in Ruby
我希望这能让你明白:)
在某种情况下...例如
(10 + 20) * 10
=> 300
括号中的表达式片段在更高优先级之前被评估 multiplication.So 它是否适用于其他运算符,因为 well.Can 我覆盖其他运算符,例如 << !
...等等
是的,你可以这样做
class String
def << str
self + "*" + str
end
end
puts "str" << "sss"
当人们评估表达式时,他们通常会从表达式的左侧开始,然后向右移动。例如,从左到右计算,我们从以下表达式得到结果 300:
10 + 20 * 10 = 300
这是因为我们作为人类,将 10
添加到 20
,得到 30
,然后乘以 10
得到 300
.让 Ruby 执行相同的计算,您会得到截然不同的答案:
> 10 + 20 * 10
=> 210
这是运算符优先级的直接结果。 Ruby 有一组规则告诉它应该在表达式中计算运算符的顺序。显然,Ruby 认为乘法运算符 (*) 的优先级高于加法运算符 (+)。
覆盖运算符优先级
内置于Ruby中的优先级可以通过用括号括起表达式的较低优先级部分来覆盖。例如:
> (10 + 20) * 10
=> 300
在上面的示例中,括号中的表达式片段在更高优先级乘法之前进行计算。
有关更多信息,请参阅:
- http://rubysnippets.com/2013/01/25/operator-overloading-in-ruby/
- Override == operator in Ruby
我希望这能让你明白:)