Während @ JohnNaegle Antwort richtig ist, finde ich diese eine etwas elegantere Weg, dies zu tun, ist #method
verwenden, die eine Method
Objekt zurückgibt. Das Methodenobjekt verfügt über eine .call(*args)
-Methode, über die Sie Argumente übergeben können. Also, mit Ihrem Beispiel würde es wie folgt aussehen:
def one(param)
puts param
end
def two(param, callback)
callback.call(param)
end
two('hi', method(:one))
Die Änderung ist, dass Sie einen Verweis auf eine Instanz Method
sind vorbei durch den Aufruf Object.method
(elbe wie method
), anstatt einen String.
Wenn Sie statt eines Method
ein Symbol übergeben Sie die folgende Version von #two
verwenden:
def two_2(param, callback)
method(callback.to_sym).call(param)
end
two_2('hi', :one)
# Or you could also pass a string or anything that #responds_to?(:to_sym)
two_2('hi', 'one')
Eine weitere Verbesserung würde ich empfehlen, so dass two
kann mehr als einen Parameter akzeptieren, um einen Pass zu spielen Der Rückruf würde zuerst den Rückruf auflisten und dann *params
verwenden, um so viele Parameter wie nötig zu empfangen. Hier ist ein Beispiel (mit Definition von #one
von oben):
def one_with_many_params(*params)
puts params.join
end
# Improved version of two
def two_3(callback, *params)
callback.call(params)
end
# Improved version of two_2
def two_4(callback, *params)
method(callback.to_sym).call(params)
end
two_3(method(:one), 'hi') #=> "hi"
two_3(method(:one_with_many_params), "Hi", " my ", "name", " is ", "Foo!")
#=> "Hi my name is Foo!"
two_4('one', 'Hello!') #=> "Hello!"
two_4(:one_with_many_params, "Hi", " my ", "name", " is ", "Bar!")
#=> "Hi my name is Bar!"
Nur eine wurde erwartet, da & Callback kein Parameter ist. – MageeWorld