[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Erratic result

coolgeng coolgeng

3/6/2008 8:49:00 AM

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

--
Best Regards
Cooper Geng

5 Answers

Jari Williamsson

3/6/2008 8:57:00 AM

0

coolgeng coolgeng wrote:
> 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

Jesús Gabriel y Galán

3/6/2008 9:02:00 AM

0

On Thu, Mar 6, 2008 at 9:49 AM, coolgeng coolgeng <coolgeng410@gmail.com> wrote:
> 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.

coolgeng coolgeng

3/6/2008 9:08:00 AM

0

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 <
jgabrielygalan@gmail.com> wrote:

> On Thu, Mar 6, 2008 at 9:49 AM, coolgeng coolgeng <coolgeng410@gmail.com>
> wrote:
> > Hi
> > I do not know how to explain the different result between the two
> > snippets:
> > First snippet:
> > def dial(digit)
> > puts digit end
> > digits =3D 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 =3D 0..9
> digits.each {|digit| dial(digit) }
>
> Jesus.
>
>


--=20
Best Regards
Cooper Geng

Jesús Gabriel y Galán

3/6/2008 9:42:00 AM

0

On Thu, Mar 6, 2008 at 10:08 AM, coolgeng coolgeng
<coolgeng410@gmail.com> wrote:
> 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.

Ken Bloom

3/7/2008 4:53:00 AM

0

On Thu, 06 Mar 2008 03:49:13 -0500, coolgeng coolgeng wrote:

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

--
Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu...