Ich habe versucht, eine Klasse zu erstellen, die über eine private Klassenmethode verfügt. Ich möchte, dass diese private Klassenmethode innerhalb einer Instanzmethode verwendet werden kann.Was bedeutet `& method (: method_name)` in Ruby?
Nachfolgend war mein erster Versuch:
class Animal
class << self
def public_class_greeter(name)
private_class_greeter(name)
end
private
def private_class_greeter(name)
puts "#{name} greets private class method"
end
end
def public_instance_greeter(name)
self.class.private_class_greeter(name)
end
end
Animal.public_class_greeter('John')
funktioniert gut, John greets private class method
Druck.
Jedoch gibt Animal.new.public_instance_greeter("John")
einen Fehler aus: NoMethodError: private method 'private_class_greeter' called for Animal:Class
.
Das wird erwartet, da der Aufruf dasselbe ist wie Animal.private_class_greeter
, was offensichtlich einen Fehler auslöst.
Nach der Suche, wie man dieses Problem behoben werden kann, kam ich mit dem folgenden Code auf, dass der Job nicht:
class Animal
class << self
def public_class_greeter(name)
private_class_greeter(name)
end
private
def private_class_greeter(name)
puts "#{name} greets private class method"
end
end
define_method :public_instance_greeter, &method(:private_class_greeter)
end
ich nicht genau verstehen, was hier passiert: &method(:private_class_greeter)
.
Könnten Sie bitte erklären, was das bedeutet?
Wenn ich ersetzen:
define_method :public_instance_greeter, &method(:private_class_greeter)
mit:
def public_instance_greeter
XYZ
end
dann, was der Inhalt anstelle von XYZ
sein sollte?
Schön erklärt. –
'&' ** übergibt keine 'Method'-Instanz als Block. Es unterscheidet den Parameter überhaupt nicht nach Typ. Es ruft implizit 'to_proc' auf einem Empfänger auf (in diesem Fall 'Method'-Instanz) und übergibt das Ergebnis (' Proc'-Instanz) an die Methode. Absolut das gleiche wie '&: to_s' ruft' Symbol # to_proc' auf ': to_s' Symbol auf und übergibt das' Proc' weiter. – mudasobwa
Ich vereinfachte die Erklärung absichtlich. Aber ich denke, ich kann etwas über 'to_proc' hinzufügen ... –