Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby Class Method Setup

I'm going through the Ruby Koans Ruby Koans and I'm at a place in "about_class_methods.rb" where there is a discussion of setting up class methods, and the Koans talk about three ways.

The two major ways to write class methods are:

1:

class Demo (define/open class)
  def self.method
end

2:

  class << self
    def class_methods
    end
  end

The koans also talk about a third method, I've never seen (that I remember):

def Demo.class_method_third_way
end

Q1 This third way is actually clearer to me than any other. Is there a reason I don't understand about why no one uses it?

Q2 Why am I wrong in thinking the syntax for 2 should be "self << def name end"? That is "Why is the syntax the way it is?" Does the class Object hold a reference to all Classes and this sticks in the method for the self class?

As always, thanks for your help and patience!

like image 235
codenoob Avatar asked Jan 10 '23 21:01

codenoob


2 Answers

In (early) development classes get renamed as insight grows (not Person but Employee, not Job but one or more Roles etc.) This renaming is prone to errors if the class name is hardcoded in the class itself.

like image 60
steenslag Avatar answered Jan 19 '23 01:01

steenslag


In class body, self refers exactly the class object being defined. That's why def self.some_method works the same as def Demo.some_method.

class Demo
  puts self.object_id == Demo.object_id
end
#=> true

class << some_obj is the syntax to access the singleton class of some_obj. Refer to the Ruby doc:

The singleton class (also known as the metaclass or eigenclass) of an object is a class that holds methods for only that instance. You can access the singleton class of an object using class << object ... Most frequently you’ll see the singleton class accessed like this:

class C
  class << self
    # ...
  end
  # or
  class << C
  end
end
like image 25
Arie Xiao Avatar answered Jan 19 '23 03:01

Arie Xiao