为什么我的 ruby​​ 方法调用不起作用? 屈服

问题描述

我不明白为什么在控制台上运行我的文件时会收到此错误消息: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 解释器不允许使用它们,但是当您使用嵌套方法调用时,最好(有时是必要)使用它们。修复它你可以做这样的事情

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

甚至更好

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

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

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)