在ruby中定义自定义运算符

时间:2013-03-26 20:53:16

标签: ruby operators monkeypatching

我希望能够定义自定义运算符。那可能吗?例如,使a***b意味着什么。

是否也可以修补现有的运营商?例如,要使a**b始终返回浮点数?

2 个答案:

答案 0 :(得分:3)

是的,你可以。例如:

class Fixnum
  def **(x)
    self.*(x)*1.0
  end
end

5**4 #==> 20.0

答案 1 :(得分:2)

自定义运营商?除非你想破解C parser(或JRuby的Java解析器或......)。 OTOH,运算符主要是方法的语法糖,你可以定义你想要的所有方法。

由于许多运算符(but not all)只是伪装的方法,因此您可以根据需要对现有运算符的实现进行修补。您必须跟踪定义自己的**实现的所有数字类并修补所有这些类;请注意,您需要覆盖核心的RationalComplex,...以及标准库中的BigDecimal等内容。我强烈建议不要这样做,你只是为了痛苦和痛苦而努力;例如,当结果不适合BigDecimal#**时,您会对Float做什么?那么Complex#**呢?如果您需要Float s,请通过to_f电话明确说明。