Что означает @ в имени функции 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 }
Как @ превращается в '->' в имени функции?
1 ответ
Решение
Имена методов для четырех унарных операторов +
, -
, ~
, а также !
являются +@
, -@
, ~@
, а также !@
, Итак, забавно выглядящие определения методов:
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
как метод экземпляра на этой лямбде.
Выглядит как злоупотребление перегрузкой унарного оператора, чтобы "изобрести" что-то, что выглядит как новое -->
, ~->
... операторы.