我有两种方法可以使用块来调用某些代码。
选项1:
foo()
选项2:
block_function do
foo()
end
如何在运行时在这两个之间切换?我真的不想做以下事情,因为foo()
实际上是很多代码:
if condition then
foo()
else
block_function do
foo()
end
end
答案 0 :(得分:1)
def condition_or_block_function
if condition
yield
else
block_function { yield }
end
end
condition_or_block_function do
foo() # which is really a lot of code :)
end
或者正如其他人所建议的那样,将foo()
一堆代码作为实际方法并写下您在OP中编写的内容。
@tadman建议使用更多通用版本:
def condition_or_block condition, block_method, *args
if condition
yield
else
send(block_method, *args) { yield }
end
end
condition_or_block(some_condition, some_block_yielding_method) do
foo() # which is really a lot of code :)
end
@Christian Oudard添加了一个注释,指定了具体问题,可选择用div做装饰代码块...结束Erector。这表明了另一种方法:
class BlockWrapper
def initialize(method=nil)
@method = method
end
def decorate
@method ? send(method) { yield } : yield
end
end
wrapper = BlockWrapper.new( condition ? nil : :div )
wrapper.decorate do
#code block
end