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.

Grund warum ich braucheyield 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 Leben

Code 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!"
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage