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:
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).
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).
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.
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.
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 And maybe this time I'll remember.