что означает @ в имени функции Ruby - PullRequest
16 голосов
/ 19 октября 2011

Что означает @ в следующем коде 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 }

Как @ превращается в '->' в функцииимя

1 Ответ

15 голосов
/ 19 октября 2011

Имена методов для четырех унарных операторов +, -, ~ и !: +@, -@, ~@ и !@. Итак, забавно выглядящие определения метода:

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 { Die.new(2) }. Затем, когда TestRocket подключен к Proc, мы можем сказать следующее:

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

и он запустит этот метод:

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

как метод экземпляра этой лямбды.

Выглядит как злоупотребление перегрузкой унарного оператора, чтобы "изобрести" нечто, похожее на новые -->, ~->, ... операторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...