Class/singleton methods

These seem to be identical. Are they?

class Foo
  def Foo.bar
    # some code
  end
end

class Foo
  def self.bar
    # some code
  end
end

If they are identical, is one form generally preferred over the other?

So a "class method" is the same as a "singleton method" on a Class object?

···

--
R. Mark Volkmann
Partner, Object Computing, Inc.

These seem to be identical. Are they?

class Foo
  def Foo.bar
    # some code
  end
end

class Foo
  def self.bar
    # some code
  end
end

They are identical. Inside Foo, self==Foo

If they are identical, is one form generally preferred over the other?

I think it's more a matter of style. The advantage of using 'self' is
that it always works with the class name (so you won't mess up cutting
and pasting or changing the name of the class), but it's less clear
what it does to others (you had to ask).

So a "class method" is the same as a "singleton method" on a Class object?

Umm, yes? I'm not always sure what those terms refer to.

I think reading this will help sort out your issues:

···

On 10/2/05, Mark Volkmann <r.mark.volkmann@gmail.com> wrote:

--
Rob

Hi --

These seem to be identical. Are they?

class Foo
def Foo.bar
   # some code
end
end

class Foo
def self.bar
   # some code
end
end

If they are identical, is one form generally preferred over the other?

The advantage of the self version is that it might be a little easier
to maintain (e.g., if you change the name of the class).

So a "class method" is the same as a "singleton method" on a Class object?

Basically, yes. I think the main difference is that they have a bit
of language-level "special case" status. There's the class_methods
method, which makes them "official". Also, because of the way
classes' singleton classes work, a subclass can actually call the
singleton methods of its parent class:

   class C
     def self.x
       puts "Calling x on #{self}"
     end
   end

   class D < C
   end

   D.x # Calling x on D

As far as I know that's the only situation where an object can call
another object's singleton method. That may be enough to warrant a
different term for them. I have to say, though, I've seen the class
method/singleton method relation serve as the "ah ha!" moment for
many, many people grappling with singleton stuff in Ruby (even if it
turns out to be a somewhat special case).

David

···

On Mon, 3 Oct 2005, Mark Volkmann wrote:

--
David A. Black
dblack@wobblini.net

David A. Black wrote:

Hi --

These seem to be identical. Are they?

class Foo
def Foo.bar
   # some code
end
end

class Foo
def self.bar
   # some code
end
end

If they are identical, is one form generally preferred over the other?

The advantage of the self version is that it might be a little easier
to maintain (e.g., if you change the name of the class).

So a "class method" is the same as a "singleton method" on a Class object?

Basically, yes. I think the main difference is that they have a bit
of language-level "special case" status. There's the class_methods
method, which makes them "official". Also, because of the way
classes' singleton classes work, a subclass can actually call the
singleton methods of its parent class:

  class C
    def self.x
      puts "Calling x on #{self}"
    end
  end

  class D < C
  end

  D.x # Calling x on D

As far as I know that's the only situation where an object can call
another object's singleton method.

Hm?

class Foo
end

f = Foo.new

def f.foo()
   puts 'foo'
end

f.foo

                               ... That may be enough to warrant a
different term for them. I have to say, though, I've seen the class
method/singleton method relation serve as the "ah ha!" moment for
many, many people grappling with singleton stuff in Ruby (even if it
turns out to be a somewhat special case).

David

E

···

On Mon, 3 Oct 2005, Mark Volkmann wrote:

Did you mean the singleton_methods method? I don't see a method named
class_methods anywhere.

···

On 10/2/05, David A. Black <dblack@wobblini.net> wrote:

Hi --

On Mon, 3 Oct 2005, Mark Volkmann wrote:

> These seem to be identical. Are they?
>
> class Foo
> def Foo.bar
> # some code
> end
> end
>
> class Foo
> def self.bar
> # some code
> end
> end
>
> If they are identical, is one form generally preferred over the other?

The advantage of the self version is that it might be a little easier
to maintain (e.g., if you change the name of the class).

> So a "class method" is the same as a "singleton method" on a Class object?

Basically, yes. I think the main difference is that they have a bit
of language-level "special case" status. There's the class_methods
method, which makes them "official".

--
R. Mark Volkmann
Partner, Object Computing, Inc.

ES wrote:

As far as I know that's the only situation where an object can call
another object's singleton method.

Meaning that the singleton method of C is being called with self as D.

My apologies if I misinterpret you David.

Hi --

···

On Mon, 3 Oct 2005, ES wrote:

David A. Black wrote:

As far as I know that's the only situation where an object can call
another object's singleton method.

Hm?

class Foo
end

f = Foo.new

def f.foo()
puts 'foo'
end

f.foo

I think you must have misunderstood me. What I mean is: as far as I
know, class methods are the only per-object methods (defined as
obj.meth) that an object other than the object they were defined on
has in its method search path.

David

--
David A. Black
dblack@wobblini.net

Hi --

···

On Mon, 3 Oct 2005, Mark Volkmann wrote:

On 10/2/05, David A. Black <dblack@wobblini.net> wrote:

Basically, yes. I think the main difference is that they have a bit
of language-level "special case" status. There's the class_methods
method, which makes them "official".

Did you mean the singleton_methods method? I don't see a method named
class_methods anywhere.

I meant class_methods, and I was wrong. For some reason, I have for
five years been going repeatedly through the cycle of thinking there
is such a method, and then being reminded that there isn't, and then
thinking that there is. It's some kind of bizarre mental glitch.

I'm actually glad there isn't :slight_smile: And maybe this time I'll remember.

David

--
David A. Black
dblack@wobblini.net