В Ruby, внутри метода класса, self это класс или экземпляр?
Я знаю это self
это экземпляр внутри метода экземпляра. Итак, это self
класс внутри метода класса? Например, будет ли работать следующее в Rails?
class Post < ActiveRecord::Base
def self.cool_post
self.find_by_name("cool")
end
end
4 ответа
Это правильно. self
внутри метода класса находится сам класс. (А также внутри определения класса, такого как self
в def self.coolpost
.)
Вы можете легко проверить эти лакомые кусочки с помощью irb:
class Foo
def self.bar
puts self.inspect
end
end
Foo.bar # => Foo
Ответов уже много, но вот почему я - это класс:
Точка меняется 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
class Test
def self.who_is_self
p self
end
end
Test.who_is_self
выход:
Тестовое задание
Теперь, если вам нужно специфичное для Rails решение, оно называется named_scopes:
class Post < ActiveRecord::Base
named_scope :cool, :conditions => { :name => 'cool' }
end
Используется так:
Post.cool
Краткий ответ: да
Что мне нравится делать с этими вопросами - просто запустить сеанс irb или./script/console
и тогда вы можете сделать следующее, чтобы увидеть магию:
ruby-1.8.7-p174 > class TestTest
ruby-1.8.7-p174 ?> def self.who_am_i
ruby-1.8.7-p174 ?> return self
ruby-1.8.7-p174 ?> end
ruby-1.8.7-p174 ?> end
=> nil
ruby-1.8.7-p174 > TestTest.who_am_i
=> TestTest
Удачной рыбалки!