以下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;'在函数名称?
答案 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
,-->
,...运算符。