define_method i block_given?

Witam,

Spotkał się ktoś z takim problemem (ruby 1.8.7)? Definiuję methodę za pomocą define_method w metodzie sprawdzam czy blok jest podany przez block_given? Nawet jeśli blok jest podany block_given? zwraca zawsze false

[code]class Foo
define_method :bar do
puts block_given? ? “block given” : “no block”
end
end

Foo.new.bar { }
=> no block[/code]
Wiem, że mogę podać &block jako argument do define_method, ale jestem ciekaw czy ktoś zna przyczynę dlaczego block_given nie działa w tej sytuacji.

Mądre głowy na kanale #ruby.pl powiedziały, że block_given? zadziała tylko w metodach. Możesz zawsze sprawdzić przekazując &blk jawnie tak jak napisałeś:

[code=ruby]class Foo
define_method :bar do |&blk|
puts blk.nil? ? “no block” : “block given”
end

end

Foo.new.bar { }
Foo.new.bar[/code]
“I’ll put my lambda in your lambda so you can call it when you call it” :slight_smile:

define_method definiuje metodę (mądre stwierdzenie ;), więc jak na mój rozum block_given? powinien być wywoływany w kontekście tak zdefiniownej metody (w tym przypadku ‘#bar’) a nie w kontekście #define_method.
Chyba, że metody utworzone przez define_method różnią się czymś od tych zdefiniowanych przez ‘def’. Ciekawe jak to wygląda w ruby 1.9, ma ktoś pod ręką żeby sprawdzić?