【问题标题】:what does @ stand for in a Ruby function name@ 在 Ruby 函数名中代表什么
【发布时间】:2011-10-19 04:11:40
【问题描述】:

在以下 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; { 2+2==4 },你会得到一个错误NoMethodError: undefined method +@' for #<0x0000010>

标签: ruby


【解决方案1】:

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

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

只需为这四个一元运算符定义重载。然后使用 Proc.send :include, TestRocket 将 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 的实例方法。

看起来有点滥用一元运算符重载来“发明”一些看起来像新 --&gt;~-&gt;、... 运算符的东西。

【讨论】:

    猜你喜欢
    • 2014-11-19
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多