Verwenden von yield in define_method in Ruby
Ist es möglich zu machenAusbeute Keyword-Arbeit in einem Block an define_method? Einfaches Beispiel:
class Test
define_method :test do |&b|
puts b # => #<Proc:...>
yield
end
end
Test.new.test {
puts "Hi!"
}
Dieser Code erzeugt in Ruby 1.8.7 und 1.9.0 den folgenden Fehler:
test.rb: 4: in `test ': kein Block angegeben (LocalJumpError) von test.rb: 8
Das Merkwürdige ist dasb Blockvariable!= nil
aberblock_given?
gibt false zurück. Ist es beabsichtigtes Ruby-Verhalten, Blöcke nicht an zu erkennen?Proc Objekte?
Bearbeiten: Grüße anBeerlingtonAntwort von:b.call()
Das ist nicht das, wonach ich suche. Die Blockvariable wurde nur verwendet, um anzuzeigen, dass der Block tatsächlich angegeben ist und in define_method nicht erkannt wird.
yield
Anstatt vonblock.call
Ich bin bereit, eine Erweiterung der Definition neuer Klassen in Ruby zu schreibenirgendein Code, den Sie in Ruby schreiben können, sollte akzeptiert werden, wenn ich meine Erweiterung verwende.
Daher kann eine ähnliche Semantik nicht berücksichtigt werden, da dies Benutzer meiner Bibliothek dazu zwingt, nur einen geeigneten Weg zum Übergeben eines Blocks zu verwenden. Dies verstößt gegen die TIMTOWTDI-Regel und macht meine Bibliothek nicht transparent.
Beispiel aus dem wirklichen LebenCode unten kann vereinfacht werden, um Code oben damy_def
Verwendetdefine_method
:
require 'my_library'
class Test
# client can write 'my_def' instead of 'def' since
# my_library extends Class class
my_def :test, "some parameter" do
yield # oh no, error :(
end
end
Test.new.test {
puts "Hi!"
}