@在Ruby函数名中代表什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (21)

@在以下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

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

这个:

-> { Die.new(2) }

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

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

它会运行:

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

作为该lambda的实例方法。

扫码关注云+社区