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” 
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ć?