gpt4 book ai didi

ruby - 如何将 block /过程和变量直接传递给函数?

转载 作者:数据小太阳 更新时间:2023-10-29 08:23:38 24 4
gpt4 key购买 nike

我正在尝试了解 block 和过程,我觉得这应该是可行的,但到目前为止我还没有成功。

我想要什么:

def main_action(generic_variable, block)
generic_variable += 1 # I do more interesting stuff than this in my version
yield(generic_variable)
end

main_action(3, {|num| num + 5 })

或类似的东西。

我找到的最接近的是 http://mudge.name/2011/01/26/passing-blocks-in-ruby-without-block.html这似乎需要创建一个传递方法来发送 block :

class Monkey

# Monkey.tell_ape { "ook!" }
# ape: ook!
# => nil
def self.tell_ape(&block)
tell("ape", &block)
end

def self.tell(name, &block)
puts "#{name}: #{block.call}"
end
end

如果我使用在我的代码中设置的相同传递方法,我可以让它工作,但它似乎是不必要的代码。我尝试直接调用 Monkey.tell("ape", { "ook!"}),但出现了 syntax error, unexpected '}', expecting tASSOC

是否可以在一次调用中将一个变量和一个 block (或 proc,我不挑剔)发送到一个函数?还有,有空的话,上面是怎么回事?为什么那行不通?

最佳答案

你似乎混淆了方 block 和过程。 block 不是 ruby​​ 对象。你不能像这样传递它

foo(args, block)

传递它的唯一方法是 foo(args){...}foo(args) do ... end。但是,在方法定义中,您可以接收一个 block ,将其转换为一个过程,并接受它作为其参数之一,如下所示:

def foo(args, &block)
...
end

另一方面,您可以像这样将 proc 对象作为参数传递

foo(args, proc)

创建proc对象有几种方法,一个接近 block 字面量的字面量是lambda:->{...},但它与 block 语法不同{...}。使用这个,你可以做

foo(args, ->{...})

但不是

foo(args, {...})

除非 {...} 是一个散列。

关于ruby - 如何将 block /过程和变量直接传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17121428/

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