[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: printing 2 dimensionl hash problem

Peña, Botp

1/18/2007 8:24:00 AM

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

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

1 Answer

Krekna Mektek

1/18/2007 10:50:00 AM

0

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