2012-07-10 38 views
1

我得到這個錯誤錯誤不使用時產量塊內給定塊

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語句裏面,

這裏是原型

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

[[email protected] 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 

任何幫助,這個代碼? 問候

回答

1

問題是,你遞歸調用gen_list,並在遞歸下降的調用網站,真的沒有塊。

你能做什麼或者是:

  • 捕捉塊作爲一個&參數一個進程,然後將其轉發,
  • 添加,做另一產量遞歸調用

所以......

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