在ruby中,我想在类上创建一个方法,将任何类型的可调用对象保存到实例变量中。这包括lambdas,blocks和Procs。例如:
obj.save_callable(lambda { |x| x * 2 })
assert_equal(10, obj.invoke_callable(5))
obj.save_callable { |x| x * 3 }
assert_equal(15, obj.invoke_callable(5))
obj.save_callable(Proc.new { |x| x * 4 })
assert_equal(20, obj.invoke_callable(5))
我知道这可能是一个毛茸茸的地方。我已经看到的一种方法是创建不同的方法,每种方法一种:
class MyClass
# pass proc or lambda
def save_callable(p)
@callable = p
end
# pass a block
def save_callable_block(&b)
@callable = b
end
def invoke_callable(*args)
@callable && @callable.call(*args)
end
end
问题:
有没有办法将其进一步简化为单 save_callable
方法?
答案 0 :(得分:4)
好吧......在写完这个问题之后,我尝试了以下内容。这实际上似乎适用于ruby 1.8.7和1.9.2:
class UnifiedSaveCallable
def save_callable(p=nil, &b)
@callable = p || b
end
def invoke_callable(*args)
@callable && @callable.call(*args)
end
end
obj = UnifiedSaveCallable.new
obj.save_callable(lambda { |x| x * 2 })
assert_equal(10, obj.invoke_callable(5))
obj.save_callable { |x| x * 3 }
assert_equal(15, obj.invoke_callable(5))
obj.save_callable(Proc.new { |x| x * 4 })
assert_equal(20, obj.invoke_callable(5))
这个成语似乎对我有用。仍然有兴趣听听是否有更好或更惯用的方式在红宝石中这样做。