루비의 클래스 메소드는 사실상 싱글톤 메소드입니다.
irb(main):001:0> class Foo irb(main):002:1> def self.bar irb(main):003:2> end irb(main):004:1> end => nil irb(main):005:0> Foo.singleton_methods => ["bar"] irb(main):006:0> Foo2 = Class.new => Foo2 irb(main):007:0> class << Foo2 irb(main):008:1> def bar irb(main):009:2> end irb(main):010:1> end => nil irb(main):011:0> Foo2.singleton_methods => ["bar"] irb(main):012:0>
그러나 여기에서 볼 수 있듯이, 둘간의 약간의 차이는 있습니다.
X = 1
class C
X = 2
def self.a
puts X
end
end
class << C def b puts X end end C.a # 2 (C::X) C.b # 1 (top-level X) [/code] 바로 상수를 보는 visibility가 다르게 되는 거죠.