我们可以覆盖Ruby中的运算符吗?

时间:2015-04-29 11:04:05

标签: ruby-on-rails ruby ruby-on-rails-3

在案例中......例如

(10 + 20) * 10
=> 300

括号中的表达式片段在更高优先级乘法之前进行求值。所以它也适用于其他运算符。可以覆盖其他运算符,例如<< ! ...等

2 个答案:

答案 0 :(得分:2)

是的,你可以,你可以这样做

class String
  def << str
    self + "*" + str
  end
end

puts "str" << "sss"  

答案 1 :(得分:2)

当人们评估表达时,他们通常从表达式的左侧开始并向右侧工作。例如,从左到右工作,我们从以下表达式得到300的结果:

10 + 20 * 10 = 300 

这是因为我们作为人类将10添加到20,结果为30,然后将其乘以10以得到300。让Ruby执行相同的计算,你会得到一个非常不同的答案:

> 10 + 20 * 10
=> 210

这是运算符优先级的直接结果。 Ruby有一组规则告诉它应该在表达式中评估运算符的顺序。显然,Ruby认为乘法运算符(*)的优先级高于加法(+)运算符。

覆盖运营商优先顺序

可以通过用括号括起表达式的低优先级部分来覆盖Ruby中内置的优先级。例如:

> (10 + 20) * 10
=> 300

在上面的例子中,括号中的表达式片段在较高优先级乘法之前被计算。

了解更多信息,请参阅:

我希望这让你清楚明白:)