Можно (хотя и смешно и запутанно) получить оба, используя делегирование метода :
class TableHelper
def initialize(&block)
# get a reference to 'self' in the block's scope:
@self_before_instance_eval = eval "self", block.binding
instance_eval &block
end
# delegate all unknown methods to the calling object:
def method_missing(method, *args, &block)
@self_before_instance_eval.send method, *args, &block
end
# Other helper methods:
def field(name, url)
# ...
end
end
Теперь вы можете использовать это так:
def some_helper(arg); end
Table.new do
field :name, some_helper("foo")
end
Будьте осторожны при использовании этого подхода: вы все равно не можете использовать переменные экземпляра из вызывающего объекта:
@field_url = "http://foo"
Table.new do
# url will be nil, since the ivar does not exist on the Table
field :name, @field_url
end