【问题标题】:Ruby: Passing a Proc to method with no parametersRuby:将 Proc 传递给不带参数的方法
【发布时间】:2018-04-19 16:50:54
【问题描述】:

所以这行得通(来自 Code-Academy):

def greeter
  yield
end

phrase = Proc.new {
  puts "Hello there!"
  }

greeter(&phrase)

我了解 yield 的作用,也了解 Proc 的作用。但是“为什么”是允许的?

IE:greeter 方法没有定义参数,甚至没有可选参数。那么为什么 ruby​​ 允许我们向它传递一些东西呢? (在本例中是对代码块的引用 (The Proc phrase)。

我的意思是这样做很好,但从规则上看,这似乎不应该被允许?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    &phrase 不是参考。它是用于显式传递块的 Ruby 注释。在这里,它将过程转换为方法调用的隐式块。由于每个方法都接受默认块作为参数,因此您的代码可以正常工作。

    【讨论】:

    • “因为每个方法都接受一个默认块作为参数,所以你的代码可以工作。” - 我想因为我还是红宝石的新手,所以我没有意识到这一点。所以你总是可以将 1 个块传递给一个方法? (我想这是有道理的,因为我们将块传递给诸如“map”和“collect”之类的东西......)。出于好奇,他们可以默认接受超过 1 个区块吗?
    • @msmith1114 否。超过 1 个块会导致对哪个块产生歧义,从而引发Syntax 错误。方法也只能接收 1 个显式块 e.d def some_method(&block);end 但是您可以传递尽可能多的块状对象(例如 Proclambda 等),因为方法 arity 将支持
    • @engineersmnky 对不起,也许我很困惑,你说我可以传递尽可能多的 Procs/Lambdas 作为参数,但我只能将一个块传递给像 {whatever} 这样明确定义的方法?
    • @msmith1114,这是正确的。您可以将Procs、lambdas 和blocks 视为可以传递的代码块。默认情况下,每个method 都允许将一个可选块传递给它。由于Procs 和lambdas 可以命名,因此您可以传递多个。检查this example我创建的。
    猜你喜欢
    • 2021-07-19
    • 2023-03-19
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多