【问题标题】:Error no block given when used yield inside a block在块内使用 yield 时没有给出块错误
【发布时间】:2012-07-10 01:23:32
【问题描述】:

我收到了这个错误

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>

当在 if 语句中的 begin 语句中的另一个块中使用 yield 时, 为了简单理解这里是原型

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

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

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

有什么帮助吗? 问候

【问题讨论】:

    标签: ruby yield


    【解决方案1】:

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

    你可以做的是:

    • 使用&amp; 参数将块捕获为proc,然后转发它,
    • 添加一个对递归调用执行另一个 yield 的块

    所以...

    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
    

    【讨论】:

      猜你喜欢
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多