--0016e6db2979760ed4048a1ea258 Content-Type: text/plain; charset=ISO-8859-1 On Mon, Jun 28, 2010 at 7:52 AM, Andy Bogdanov <andy.bogdanov / gmail.com>wrote: > Hello > > I was trying to make an iterator that goes through a simple tree > structure something like that: > > class Node > ... > def each_child(&block) > @children.each { |child| yield(child) { child.each_child(&block) } } > end > ... > end > > so i could generate a simple html menu: > > puts "<ul>" > root_node.each_child { |node| > puts "<li><a href #{child.link}\">#{child.title}</a></li>" > unless node.children.empty? > puts "<ul>" > yield > puts "</ul>" > end > } > puts "</ul>" > > But it turns out that Ruby syntax prohibits passing blocks to yield. A > simple workaround is to use block.call instead of yield everywhere. > > Is there any good reason for that limitation? > -- > Posted via http://www.ruby-forum.com/. > > Looks like you can get it to work by explicitly taking the block, rather than trying to yield. def foo(&block) block.call 1 do 2 end end foo do |param,&block| puts "The param is #{param}" puts "The block is #{block.call}" end I checked it on 1.8.7 - 1.9.2, it does not work on 1.8.6, though. --0016e6db2979760ed4048a1ea258--