[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

The last evaluated expression for this method?

Avi S g

11/19/2006 9:16:00 PM

I wrote a simple version of the collect method for the Array class
called my_collect. Here is what I wrote:

class Array
def my_collect
result = []
self.each {|element| result.push(yield(element))}
result
end
end

x = [1,2,3].my_collect {|element| element + 1}
print x

It prints out 234 correctly. However, I was puzzled by what x contained
if I removed the return value 'result', that is:

class Array
def my_collect
result = []
self.each {|element| result.push(yield(element))}
#Removed return value
end
end

x = [1,2,3].my_collect {|element| element + 1}
print x

It prints out 123. Why? The last evaluated expression would probably be
result.push(yield(3)), and since push returns the resulting array,
wouldn't it be 234 in this case as well?

Thanks,
FeralHound

--
Posted via http://www.ruby-....

3 Answers

David Kastrup

11/19/2006 9:22:00 PM

0

Avi S g <avishek.sen.gupta@gmail.com> writes:

> I wrote a simple version of the collect method for the Array class
> called my_collect. Here is what I wrote:
>
> class Array
> def my_collect
> result = []
> self.each {|element| result.push(yield(element))}
> result
> end
> end
>
> x = [1,2,3].my_collect {|element| element + 1}
> print x
>
> It prints out 234 correctly. However, I was puzzled by what x contained
> if I removed the return value 'result', that is:
>
> class Array
> def my_collect
> result = []
> self.each {|element| result.push(yield(element))}
> #Removed return value
> end
> end
>
> x = [1,2,3].my_collect {|element| element + 1}
> print x
>
> It prints out 123. Why? The last evaluated expression would probably
> be result.push(yield(3)),

No. The last evaluated block of self.each would be
result.push(yield(3)), but each does not return the last evaluated
block, but rather the original array.

> and since push returns the resulting array, wouldn't it be 234 in
> this case as well?

No.

--
David Kastrup, Kriemhildstr. 15, 44793 Bochum

Stefano Crocco

11/19/2006 9:25:00 PM

0

Alle 22:16, domenica 19 novembre 2006, Avi S g ha scritto:
> It prints out 123. Why? The last evaluated expression would probably be
> result.push(yield(3)), and since push returns the resulting array,
> wouldn't it be 234 in this case as well?

The last evaluated expression is not yield, but [1,2,3].each, which returns
self, i.e [1,2,3]

Logan Capaldo

11/19/2006 9:28:00 PM

0

On Mon, Nov 20, 2006 at 06:16:17AM +0900, Avi S g wrote:
> I wrote a simple version of the collect method for the Array class
> called my_collect. Here is what I wrote:
>
> class Array
> def my_collect
> result = []
> self.each {|element| result.push(yield(element))}
> result
> end
> end
>
> x = [1,2,3].my_collect {|element| element + 1}
> print x
>
> It prints out 234 correctly. However, I was puzzled by what x contained
> if I removed the return value 'result', that is:
>
> class Array
> def my_collect
> result = []
> self.each {|element| result.push(yield(element))}
> #Removed return value
> end
> end
>
> x = [1,2,3].my_collect {|element| element + 1}
> print x
>
> It prints out 123. Why? The last evaluated expression would probably be
> result.push(yield(3)), and since push returns the resulting array,
> wouldn't it be 234 in this case as well?
>
x.each { } by convention returns x. In other words, it's as if
Array#each was defined like so:

class Array
def my_each
i = 0
while i < self.length
yield( self[i] )
i += 1
end
self # last evaluated expression for each is here.
end
end

> Thanks,
> FeralHound
>
> --
> Posted via http://www.ruby-....