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