Method call within a class

Hi all,

Maybe I miss something. But I am confused about method call within a
class. What is the format for that? I just copy some code segments from
the forum as follows:

module Enumerable
def each_with_index
   i = 0
    each do |elem|
       yield elem, i
      i += 1
    end
  end
end

class Array
   def each_with_index
    size.times do |i|
      yield self[i], i
     end
   end
end

So
1) which one is the reciever for "each"?
2) which one is the reciever for "size"?

Do they default to self?

Thanks,

Li

···

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

Hei,

  "each"'s receiver will be an instance of a class that includes the
module Enumerable and "size"'s receiver will be an instance of the class
Array. Example:

array = Array.new
p array.size # => 0

class MyEnumerable
  include Enumerable

end

foo = MyEnumerable.new
foo.each_with_index # doesn't raise, the method is defined

HTH

···

--
Andrea Dallera

On Mon, 2010-04-12 at 02:48 +0900, Li Chen wrote:

Hi all,

Maybe I miss something. But I am confused about method call within a
class. What is the format for that? I just copy some code segments from
the forum as follows:

module Enumerable
def each_with_index
   i = 0
    each do |elem|
       yield elem, i
      i += 1
    end
  end
end

class Array
   def each_with_index
    size.times do |i|
      yield self[i], i
     end
   end
end

So
1) which one is the reciever for "each"?
2) which one is the reciever for "size"?

Do they default to self?

Thanks,

Li

Andrea Dallera wrote:

Hei,

  "each"'s receiver will be an instance of a class that includes the
module Enumerable and "size"'s receiver will be an instance of the class
Array. Example:

array = Array.new
p array.size # => 0

class MyEnumerable
  include Enumerable

end

foo = MyEnumerable.new
foo.each_with_index # doesn't raise, the method is defined

Hi Andrea,

Thank you very much. So the receiver can be omitted when the method is
called within a class, right?

Li

···

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

Hei Li,

  yes, the default deceiver is 'self' so, if omitted, the receiver for
any message will be the istance itself.

···

--
Andrea Dallera

On Mon, 2010-04-12 at 04:15 +0900, Li Chen wrote:

Andrea Dallera wrote:
> Hei,
>
> "each"'s receiver will be an instance of a class that includes the
> module Enumerable and "size"'s receiver will be an instance of the class
> Array. Example:
>
> array = Array.new
> p array.size # => 0
>
> class MyEnumerable
> include Enumerable
>
> end
>
> foo = MyEnumerable.new
> foo.each_with_index # doesn't raise, the method is defined
>

Hi Andrea,

Thank you very much. So the receiver can be omitted when the method is
called within a class, right?

Li

Except on assignments, because it looks like you are creating a local
variable.
Example:

class Foo
  attr_accessor :bar
  def bad_assign
    bar = 'baz'
    defined? bar
  end
  def good_assign
    self.bar = 'baz'
    defined? bar
  end
end

foo = Foo.new

foo.bad_assign # => "local-variable"
foo.bar # => nil

foo.good_assign # => "method"
foo.bar # => "baz"

···

On Sun, Apr 11, 2010 at 2:15 PM, Li Chen <chen_li3@yahoo.com> wrote:

Hi Andrea,

Thank you very much. So the receiver can be omitted when the method is
called within a class, right?

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

Josh Cheek wrote:

···

On Sun, Apr 11, 2010 at 2:15 PM, Li Chen <chen_li3@yahoo.com> wrote:

Hi Andrea,

Except on assignments, because it looks like you are creating a local
variable.
Example:

class Foo
  attr_accessor :bar
  def bad_assign
    bar = 'baz'
    defined? bar
  end
  def good_assign
    self.bar = 'baz'
    defined? bar
  end
end

foo = Foo.new

foo.bad_assign # => "local-variable"
foo.bar # => nil

foo.good_assign # => "method"
foo.bar # => "baz"

Thank you so much. Where can I find more info about this usage?

Li

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