Krekna Mektek
1/18/2007 10:50:00 AM
2007/1/18, Peña, Botp <botp@delmonte-phil.com>:
> From: Krekna Mektek [mailto:krekna@gmail.com] :
> #----------------------------------------------------------
> # @h.each do |key,value|
> # print key, " is ", value.each {|x| print x, " -- " }, "\n"
> #
> # The print is strange, becuase it looks like this now:
> #
> # 1 -- 2 -- 3 -- A is 123
> # 4 -- 5 -- 6 -- B is 456
> #
> # 1. How come the code block is executed first
> #----------------------------------------------------------
>
> print expects to print a value of the expression (of course). so before prints does the writing, it has to get the value first.
>
> #----------------------------------------------------------
> # 2. After that the key and value is printed, however, I don't see the
> print for the values here (except for the print in de the code block,
> which was executed already).
> #----------------------------------------------------------
>
> "value.each {...} " is an expression that returns a value, in this case the array "value". that expression however will perform *first a {|x| print x, "---"} for every element x in array "value".
>
Thank you for your explanation!
I see now, that value.each is an argument to the print, which is not
what I need indeed, because like you said value.each with its code
block is already printing the values, so that's why they are printed
twice.
So, I've put the value.each on a separate line like in your example now.
Thus, the value.each expression is returned first, apparently the
arguments are parse before the (first) print is executed.
Same as this:
irb(main):012:0> print "I", " am ", "#{print "first "}"
first I am => nil
Krekna
> eg,
>
>
> C:\temp\rubygems-0.9.1>cat test.rb
>
> h = {"A" => [1,2,3], "B" =>[4,5,6]}
>
> puts "sample 1"
> h.each do |key,value|
> print key, " is "
> value.each {|x| print x, " -- " }
> print "\n"
> end
> puts
> puts "sample 2"
> h.each do |key,value|
> puts "#{key} is #{value.join(' -- ')}"
> end
>
>
> C:\temp\rubygems-0.9.1>ruby test.rb
> sample 1
> A is 1 -- 2 -- 3 --
> B is 4 -- 5 -- 6 --
>
> sample 2
> A is 1 -- 2 -- 3
> B is 4 -- 5 -- 6
>
> hth.
> kind regards -botp
>
>