@代表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 } 

@如何在函数名中变成’ – >’?

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

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

只为这四个一元运算符定义重载。 然后使用Proc.send :include, TestRocketProc.send :include, TestRocket修补到Proc类中。

这个:

 -> { Die.new(2) } 

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

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

它将运行此方法:

 def +@; _show _test :_pass, :_fail end 

作为该lambda的实例方法。

看起来有点滥用一元运算符重载“发明”看起来像新的东西-->~-> ,…运算符。