gpt4 book ai didi

ruby - 在 block 内使用 yield 时出错 no block given

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:08 25 4
gpt4 key购买 nike

我遇到了这个错误

LocalJumpError: no block given (yield)
from fops.rb:52:in `block (2 levels) in gen_list'
from /home/phanindra/.gem/ruby/1.9.1/gems/mp3info-0.6.18/lib/mp3info.rb:306:in `open'
from fops.rb:51:in `block in gen_list'
from fops.rb:46:in `each'
from fops.rb:46:in `gen_list'
from fops.rb:48:in `block in gen_list'
from fops.rb:46:in `each'
from fops.rb:46:in `gen_list'
from fops.rb:48:in `block in gen_list'
from fops.rb:46:in `each'
from fops.rb:46:in `gen_list'
from fops.rb:48:in `block in gen_list'
from fops.rb:46:in `each'
from fops.rb:46:in `gen_list'
from (irb):2
from /usr/bin/irb:12:in `<main>

当在另一个 block 内使用 yield 时,它位于 if 语句内的 begin 语句内,为了简单理解这里是原型(prototype)

def test
if 1 then
begin
test2(5) do |x|
yield x
end
rescue
end
end
end

def test2(n)
n.times do |k|
yield k
end
end
test() do |y|
puts y
end

问题是原型(prototype)没有错误,它工作正常所以我不明白为什么我会收到这个错误,这是我的实际代码

require "mp3info"
module MusicTab
module FOps

def self.gen_list(dir)
prev_pwd=Dir.pwd
begin
Dir.chdir(dir)
rescue Errno::EACCES
end
Dir[Dir.pwd+'/*'].each{|x|
if File.directory?(x) then
self.gen_list(x)
else
begin
Mp3Info.open(x) do |y|
yield "#{y.tag.title},#{y.tag.album},#{y.tag.artist},#{x}"
end
rescue Mp3InfoError
end
end
}
Dir.chdir(prev_pwd)
end
end
end

我正在使用 irb 测试这段代码

[phanindra@pahnin musictab]$ irb
irb(main):001:0> load 'fops.rb'
/usr/share/rubygems/rubygems/custom_require.rb:36:in `require': iconv will be deprecated in the future, use String#encode instead.
=> true
irb(main):002:0> MusicTab::FOps.gen_list('/fun/Music') do |l|
irb(main):003:1* puts l
irb(main):004:1> end

有什么帮助吗?问候

最佳答案

问题是您正在递归调用 gen_list 并且在递归下降的调用点确实没有 block 。

你可以做的是:

  • 使用 & 参数将 block 捕获为 proc,然后将其转发,
  • 在递归调用中添加一个执行另一个 yield 的 block

所以...

def f1 x, &block
block.call(x)
if x > 0
f1 x - 1, &block
end
end

# ...or...

def f2 x
yield x
if x > 0
f2 x - 1 do |y|
yield y
end
end
end

f1 2 do |q|
p ['b1', q]
end

f2 2 do |q|
p ['b2', q]
end

关于ruby - 在 block 内使用 yield 时出错 no block given,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415491/

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