A syntax question about nested 'each' blocks


#1

Would someone explain the syntax of nested blocs vis-a-vis the use of
Array.each ?

I thought that ‘lname’ would be an element of an Array in the program
below. But the interpreter (ruby-1.8.4-1.fc3 in Fedora Core 3) tells
me it is the entire Array.

first_name = Array.[]( "Joe ","Albert ","Lilly ","Henry ","Becky
","Ray ")
last_name = Array.[]( “Groster”, “Riplaid”, “Pewley”, “Lundrund”,
“Banks” }}

tmp_name = “long string of nothing”

first_name.each { |fname|

 last_name.each { |lname|

      tmp_name = fname
     #  tmp_name = fname + lname   # This produces a syntax error
     #  puts(tmp_name)

     puts( lname.inspect)

}

}


#2

unknown wrote:

Would someone explain the syntax of nested blocs vis-a-vis the use of
Array.each ?

Your code works for me, but I had to first replace the }} with ) at the
end of your last_names definition. I also removed Array.new which is
unneeded, though you can keep that if you want:

first_name = [ "Joe ","Albert ","Lilly ","Henry ","Becky ","Ray " ]
last_name = [ “Groster”, “Riplaid”, “Pewley”, “Lundrund”, “Banks” ]

Jeff
www.softiesonrails.com


#3

Thanks. My code works for me too, with your corrections! But does it
work for you to use

last_name = %w{ Groster Riplaid Pewley Lundrund Banks }

(as in Programming Ruby 1st Ed p 10 )
That’s what I had before I mangled it in my experimentations.


#4

… or rather
last_name = Array.[] %w { Groster Riplaid Pewley Lundrund Banks }

(I’m beginning to see that Ruby syntax is rather like bash syntax, but
only in that almost anything you type will at least start to do
something.)


#5

… I meant:

last_name = Array.new[] %w{ Groster Riplaid Pewley Lundrund Banks}

It does work for me if I leave out Array.new[]


#6

removed_email_address@domain.invalid wrote:

Thanks. My code works for me too, with your corrections! But does it
work for you to use

last_name = %w{ Groster Riplaid Pewley Lundrund Banks }

Yes.

robert

#7

unknown wrote:

… or rather
last_name = Array.[] %w { Groster Riplaid Pewley Lundrund Banks }

(I’m beginning to see that Ruby syntax is rather like bash syntax, but
only in that almost anything you type will at least start to do
something.)

Try:

last_name = Array.[] *%w{ Groster Riplaid Pewley Lundrund Banks }

Notice there is no space between the “%w” and “{”. Also note the use of
the splat operator “*” to flatten the array into the argument list.

Without the splat, it is equivalent to:

Array[ %w{ a b } ]   =>   Array[ [ 'a', 'b' ] ]

With the splat, it is equivalent to:

Array[ * %w{ a b } ] =>   Array[ 'a', 'b' ]

HTH


– Jim W.