class/singleton methods

M

Mark Volkmann

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

Rob Rypka

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=3D=3DFoo
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:

http://www.rubygarden.org/ruby?ClassMethods
 
D

David A. Black

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
 
E

ES

David said:
Hi --




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



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
 
N

Nicholas Seckar

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

My apologies if I misinterpret you David.
 
D

David A. Black

Hi --

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
 
M

Mark Volkmann

Hi --



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).
ct?

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

David A. Black

Hi --

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.


David
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,565
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top