Уже много ответов, но вот почему self - это класс:
Точка меняется self
на то, что находится перед точкой. Итак, когда вы делаете foo.bar
, то для bar
-метода self
равно foo
. Нет разницы с методами класса. При звонке Post.cool_post
вы измените self
на Post
.
Важно отметить, что self
определяет не способ определения метода, а способ его вызова. Вот почему это работает:
class Foo
def self.bar
self
end
end
class Baz < Foo
end
Baz.bar # => Baz
Или это:
module Foo
def bar
self
end
end
class Baz
extend Foo
end
Baz.bar # => Baz