Hi,
In message "[ruby-talk:00867] call with a Proc"
on 99/10/28, ts <decoux / moulon.inra.fr> writes:
> I've some problem to understand how ruby pass its argument, specially when
> it has a proc has parameter.
>moulon% cat b.rb
>#!/usr/bin/ruby
>require "ftplib"
>b = FTP.new("moulon.inra.fr", "ftp", 'ts / moulon.inra.fr')
>b.list('pub').each {|i| puts i}
>b.retrlines("LIST pub", Proc.new {|i| puts i})
>b.list('pub', Proc.new {|i| puts i})
FTP#list is defined as
def list(*args, &block) ...
which means to be called in the forms as
b.list(arg1, arg2, ...){ ... }
or
b.list(arg1, arg2, &Proc.new{ ... })
This definition form is used to give a name to block. For instance,
the following travarses tree recursively and evaluate block at each
nodes:
class Tree
def Tree.[](*args)
Tree.new(*args)
end
def initialize(data, *args)
@data = data
@children = args unless args.empty?
end
def each(other = :PRE, &block)
yield @data if other == :PRE
if @children
@children.each{|node| node.each(&block)}
end
yield @data if other == :POST
end
end
t = Tree[3, Tree[2], Tree["foo"]]
t.each{|i| p i}
t.each(:POST){|i| p i}
Hope this helps
-- gotoken