Это работает с Ruby 1.8.7, но не с 1.8.6:
class X
define_method(:foo) do |bar, &baz|
puts bar
baz.call if baz
end
end
Тестирование с:
X.new.foo("No block")
X.new.foo("With block") { puts " In the block!"}
p = proc {puts " In the proc!"}
X.new.foo("With proc", &p)
дает:
No block
With block
In the block!
With proc
In the proc!
(с 1.8.6 это дает syntax error, unexpected tAMPER, expecting '|'
.)
Если вам нужны дополнительные аргументы, а также блок, вы можете попробовать что-то вроде этого:
class X
define_method(:foo) do |*args, &baz|
if args[0]
bar = args[0]
else
bar = "default"
end
puts bar
baz.call if baz
end
end
тестирование с:
X.new.foo
X.new.foo { puts " No arg but block"}
дает:
default
default
No arg but block