17 Stimmen

was bedeutet @ im Namen einer Ruby-Funktion

Wofür steht das @ im folgenden Ruby-Code?

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

Dann wird dies als verwendet:

+-> { Die.new(2) }
--> { raise }
+-> { 2 + 2 == 4 }

Wie wird aus @ ein '->' im Funktionsnamen?

16voto

mu is too short Punkte 411765

Die Methodennamen für die vier unären Operatoren + , - , ~ et ! sind +@ , -@ , ~@ et !@ . Also die komisch aussehenden Methodendefinitionen:

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

definieren Sie einfach Überladungen für diese vier unären Operatoren. Dann wird TestRocket in die Klasse Proc eingefügt, indem Proc.send :include, TestRocket .

Dies:

-> { Die.new(2) }

ist einfach eine Lambda-Definition und eine andere Art, zu schreiben lambda { Die.new(2) } . Dann, mit TestRocket in Proc gepatcht können wir dies sagen:

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

und es wird diese Methode ausgeführt:

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

als Instanzmethode für dieses Lambda.

Sieht ein wenig nach einem Missbrauch des unären Operators Überladung aus, um etwas zu "erfinden", das wie new aussieht --> , ~-> , ... Betreiber.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X