@代表以下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
Run Code Online (Sandbox Code Playgroud)
然后用作:
+-> { Die.new(2) }
--> { raise }
+-> { 2 + 2 == 4 }
Run Code Online (Sandbox Code Playgroud)
@如何在函数名中变成' - >'?
mu *_*ort 15
四个一元运算符的方法名+,-,~,和!是+@,-@,~@,和!@.所以有趣的方法定义:
def +@; _show _test :_pass, :_fail end
def -@; _show _test :_fail, :_pass end
def ~@; _show _pend; end
def !@; _show _desc; end
Run Code Online (Sandbox Code Playgroud)
只为这四个一元运算符定义重载.然后使用将TestRocket修补到Proc类中Proc.send :include, TestRocket.
这个:
-> { Die.new(2) }
Run Code Online (Sandbox Code Playgroud)
只是一个lambda定义和另一种写作方式lambda { Die.new(2) }.然后,将TestRocket修补到Proc中,我们可以这样说:
+-> { Die.new(2) }
# + lambda { Die.new(2) }
Run Code Online (Sandbox Code Playgroud)
它将运行此方法:
def +@; _show _test :_pass, :_fail end
Run Code Online (Sandbox Code Playgroud)
作为该lambda的实例方法.
貌似有点单目运算符重载"发明"的东西,看起来像新的滥用-->,~->......运营商.
| 归档时间: |
|
| 查看次数: |
349 次 |
| 最近记录: |