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

···

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

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

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]

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

···

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

Thanks,
FeralHound

--
Posted via http://www.ruby-forum.com/\.