Erratic result

  • Thread starter coolgeng coolgeng
  • Start date
C

coolgeng coolgeng

[Note: parts of this message were removed to make it a legal post.]

Hi
I do not know how to explain the different result between the two
snippets:
First snippet:
def dial(digit)
puts digit end
digits = 0..9
puts digits.each {|digit| dial(digit) }

output:
0
1
2
3
4
5
6
7
8
9
0..9

Second snippet:
(0..9).each do |digit|
puts digit
end

output:
0
1
2
3
4
5
6
7
8
9


Why did the first snippet will generate the word like "0..9" at last line?
 
J

Jari Williamsson

coolgeng said:
I do not know how to explain the different result between the two
snippets:
First snippet:
def dial(digit)
puts digit end
digits = 0..9
puts digits.each {|digit| dial(digit) }

output:
0
1
2
3
4
5
6
7
8
9
0..9

You probably want this:

def dial(digit)
puts digit
end
digits = 0..9
digits.each {|digit| puts dial(digit) }


Best regards,

Jari Williamsson
 
J

Jesús Gabriel y Galán

Hi
I do not know how to explain the different result between the two
snippets:
First snippet:
def dial(digit)
puts digit end
digits = 0..9
puts digits.each {|digit| dial(digit) }
Why did the first snippet will generate the word like "0..9" at last line?

Because you are calling puts with the result of the each method, which
in this is the range.
Take into account that .each will run the block yielding each element,
and then will return something.
You can remove the last puts:

def dial(digit)
puts digit
end
digits = 0..9
digits.each {|digit| dial(digit) }

Jesus.
 
C

coolgeng coolgeng

Yeah, it does work. But I really want to know what does it happen?
such as "puts digits.each {|digit| dial(digit) }"
or "digits.each {|digit| dial(digit) }"

the former will print the digits value at the last line,but the latter will
not


On Thu, Mar 6, 2008 at 5:01 PM, Jes=FAs Gabriel y Gal=E1n <
line?

Because you are calling puts with the result of the each method, which
in this is the range.
Take into account that .each will run the block yielding each element,
and then will return something.
You can remove the last puts:

def dial(digit)
puts digit
end
digits =3D 0..9
digits.each {|digit| dial(digit) }

Jesus.


--=20
Best Regards
Cooper Geng
 
J

Jesús Gabriel y Galán

Yeah, it does work. But I really want to know what does it happen?
such as "puts digits.each {|digit| dial(digit) }"

This:
puts digits.each {|digit| dial(digit) }

is equivalent to this:

a = digits.each {|digit| dial(digit) }
puts a

The first line is the loop and prints each digit.
The second line prints the result of the each method.
or "digits.each {|digit| dial(digit) }"

In this case you don't do anything with the return value of the each method.
the former will print the digits value at the last line,but the latter will
not

Jesus.
 
K

Ken Bloom

[Note: parts of this message were removed to make it a legal post.]

Hi
I do not know how to explain the different result between the two
snippets:
def dial(digit)
puts digit end
digits = 0..9
puts digits.each {|digit| dial(digit) }

It's that extra puts before digits.each
By convention, #each returns self, so after using dial to call puts for
each individual digit, you also call puts on the return value of
digits.each, which is digits itself. puts calls #to_s on digits, which
for a Range gives you the source code representation of the range.

--Ken
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,071
Latest member
MetabolicSolutionsKeto

Latest Threads

Top