@在Ruby函数名中代表什么

时间:2011-10-19 04:11:40

标签: ruby

以下Ruby代码中的@代表什么:

module TestRocket
  extend Module.new { attr_accessor :out }

  def _test(a, b); send((call rescue()) ? a : b); end

  def +@; _show _test :_pass, :_fail end
  def -@; _show _test :_fail, :_pass end
  def ~@; _show _pend;               end
  def !@; _show _desc;               end

  def _show(r); (TestRocket.out || $>) << r; r end
  def _pass; "     OK\n"; end
  def _fail; "   FAIL @ #{source_location * ':'}\n"; end
  def _pend; "PENDING '#{call}' @ #{source_location * ':'}\n"; end
  def _desc; "   FIRE '#{call}'!\n"; end
end

Proc.send :include, TestRocket

然后将其用作:

+-> { Die.new(2) }
--> { raise }
+-> { 2 + 2 == 4 }

@如何变成' - &gt;'在函数名称?

1 个答案:

答案 0 :(得分:15)

四个一元运算符+-~!的方法名称为+@-@,{{ 1}}和~@。所以有趣的方法定义:

!@

只为这四个一元运算符定义重载。然后使用def +@; _show _test :_pass, :_fail end def -@; _show _test :_fail, :_pass end def ~@; _show _pend; end def !@; _show _desc; end 将TestRocket修补到Proc类中。

此:

Proc.send :include, TestRocket

只是一个lambda定义和另一种写-> { Die.new(2) } 的方式。然后,将TestRocket修补到Proc中,我们可以这样说:

lambda { Die.new(2) }

它将运行此方法:

+-> { Die.new(2) }
# + lambda { Die.new(2) }

作为该lambda的实例方法。

看起来有点滥用一元运算符重载以“发明”看起来像新的def +@; _show _test :_pass, :_fail end -->,...运算符。