Блоки являются замыканиями, и arg
действительно доступен внутри блока Class.new
. Он просто недоступен внутри метода foo
, потому что def
запускает новую область видимости. Если вы замените def
на define_method
, что займет блок, вы увидите желаемый результат:
def R(arg)
Class.new do
define_method(:foo) do
puts arg
end
end
end
class A < R("Hello!")
end
A.new.foo # Prints: Hello!