The last evaluated expression for this method?

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

Avi S g [email protected] writes:

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

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]

On Mon, Nov 20, 2006 at 06:16:17AM +0900, Avi S g wrote:

#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