@代表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, TestRocket
将Proc.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的实例方法。
看起来有点滥用一元运算符重载“发明”看起来像新的东西-->
, ~->
,…运算符。
- 可以将表单添加到rails中的另一个模型视图中
- 使用Ruby作为脚本语言,使用具有4gb RAM的计算机对30gb字符串进行排序的最佳方法是什么?
- 为什么从ASCII-8BIT到UTF-8会出现字符串编码问题“\ xE2”?
- 如何处理Ruby 2.1.2内存泄漏?
- 如何在Rails 3.1中复制class_inheritable_accessor的行为?
- 随机慢速Rack :: MethodOverride#调用Heroku上的rails应用程序
- 使用Ruby,使哈希值通过它们的值找到彼此
- “错误 – :演员坠毁了! Celluloid :: DeadActorError:试图在“跑步时”调用一个死去的演员“jekyll watch”或“jekyll serve”
- 如何替换字符串中的字符