gpt4 book ai didi

ruby - 如何编写 ruby​​ 方法来接受和保存 lambda、 block 或 Proc?

转载 作者:数据小太阳 更新时间:2023-10-29 07:57:26 25 4
gpt4 key购买 nike

在 ruby​​ 中,我想在一个类上创建一个方法,它将任何类型的可调用对象保存到一个实例变量中。这包括 lambda、 block 和 Proc。例如:

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 方法吗?

最佳答案

好吧...写完这个问题后,很高兴,我尝试了以下方法。这实际上似乎在 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))

这个成语似乎对我有用。仍然有兴趣听听是否有更好或更惯用的方法在 ruby​​ 中执行此操作。

关于ruby - 如何编写 ruby​​ 方法来接受和保存 lambda、 block 或 Proc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7265498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com