【问题标题】:Why doesn't my ruby method call work? (yield) [duplicate]为什么我的 ruby​​ 方法调用不起作用? (产量)[重复]
【发布时间】:2021-04-11 03:47:56
【问题描述】:

当我在控制台上运行我的文件时,我无法弄清楚为什么会收到此错误消息:no block given (yield) (LocalJumpError)

这是我的代码:

def block_splitter(array)
  array.partition { |item| yield(item) }
end

beatles = ["John", "Paul", "Ringo", "George"]

puts block_splitter(beatles) do |beatle|
  beatle.start_with?("P")
end

感谢您的帮助!

【问题讨论】:

    标签: ruby yield


    【解决方案1】:

    这是一个空格问题。您的问题出在这一行:

    puts block_splitter(beatles) do |beatle|
      # ...
    end
    

    上面的代码是这样解释的:

    puts(block_splitter(beatles)) do |beatle|
      # ...
    end
    

    即ruby 解释器认为该块被传递给puts 方法,而不是block_splitter 方法。

    通过分配一个变量并打印结果,您会看到它按预期工作:

    result = block_splitter(beatles) do |beatle|
      beatle.start_with?("P")
    end
    
    puts result
    

    或者,您可以将其定义为 1-liner,ruby 解释器会按照您的预期处理它:

    puts block_splitter(beatles) { |beatle| beatle.start_with?("P") }
    

    或者,您可以将其包裹在额外的括号中:

    puts(block_splitter(beatles) do |beatle|
      beatle.start_with?("P")
    end)
    

    【讨论】:

    • 感谢您的所有解释,我现在清楚多了!
    【解决方案2】:

    所以缺少括号是有问题的。 Ruby 解释器不允许使用这些,但是当您使用嵌套方法调用时,最好(有时是必要的)使用它们。修复它你可以这样做

        puts(block_splitter(beatles) do |beatle| 
            beatle.start_with?("P")
        end)
    

    甚至更好

    puts(block_splitter(beatles) {|beatle| beatle.start_with?("P")})
    

    【讨论】:

    • 非常感谢,我不知道,真的很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2019-08-29
    • 2014-10-26
    • 2021-01-30
    • 2015-03-14
    • 2014-11-03
    • 1970-01-01
    相关资源
    最近更新 更多