gpt4 book ai didi

ruby-on-rails - 如何在 Ruby 中预填充函数的参数?

转载 作者:行者123 更新时间:2023-12-05 09:27:54 25 4
gpt4 key购买 nike

假设我有一个函数 foo:

def foo(A, B, C)
A + B + C
end

我这样调用它,只改变最后一个参数:

foo("foo", "bar", "123")
foo("foo", "bar", "456")
foo("foo", "bar", "789")

如何“烘焙”或“预填充”不改变的参数?所以也许我会得到一个新的可调用 foo_baked 这样 foo_baked("123")foo("foo", "bar", "123"")?

然后像这样使用它:

foo_baked = ...?
foo_baked("123")
foo_baked("456")
foo_baked("789")

请注意,我不想使用 def 定义一个新函数,而是希望能够在运行时动态创建 foo_baked,也许是一个数组。

最佳答案

Ruby 有 function-currying内置 curry方法:

def foo(a, b, c)
a + b + c
end

foo_baked = method(:foo).curry.call('foo', 'bar')

# this returns "foobar123"
foo_baked.call('123')

# ArgumentError (wrong number of arguments (given 4, expected 3))
foo_baked.call('123', '234')

基本上,Method#curry 返回一个 curried proc:一个预先加载参数的函数,只有在传递了足够的参数以满足方法签名后才会执行。

注意 foo_baked.lambda? 返回 true,所以柯里化(Currying)过程是 actually a lambda .这很重要,因为这意味着如果超过参数的最大数量,您将得到一个 ArgumentError

您可以通过将 arity 参数传递给 curry 来允许除所需的三个参数之外的其他参数。

def foo(*args)
args.join
end

# does not execute since only 2 arguments have been supplied
foo_baked = method(:foo).curry(3).call('foo', 'bar')

# executes on the third argument
# this returns "foobar123"
foo_baked.call('123')

# this returns "foobar123234"
foo_baked.call('123', '234')

关于ruby-on-rails - 如何在 Ruby 中预填充函数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71958464/

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