--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--