(Ruby, Rails) Контекст SELF в модулях и библиотеках ...? - PullRequest
27 голосов
/ 08 июня 2009

Быстрый вопрос относительно использования «SELF» внутри модуля или библиотеки. По сути, какова область действия / контекст «SELF», поскольку он относится к модулю или библиотеке и как его правильно использовать? Для примера того, о чем я говорю, проверьте модуль «AuthenticatedSystem», установленный с «restful_authentication».

ПРИМЕЧАНИЕ. Мне известно, что «self» приравнивается к «this» в других языках и как «self» работает с классом / объектом, однако в контексте модуля / библиотеки «self» ничего не значит. Итак, каков контекст себя внутри чего-то вроде модуля, где нет класса?

Ответы [ 2 ]

47 голосов
/ 09 июня 2009

В модуле:

Когда вы видите self в методе экземпляра, он ссылается на экземпляр класса, в который включен модуль.

Когда вы видите self вне метода экземпляра, это относится к модулю.

module Foo
  def a
    puts "a: I am a #{self.class.name}"
  end

  def Foo.b
    puts "b: I am a #{self.class.name}"
  end

  def self.c
    puts "c: I am a #{self.class.name}"
  end
end

class Bar
  include Foo

  def try_it
    a
    Foo.b # Bar.b undefined
    Foo.c # Bar.c undefined
  end
end

Bar.new.try_it
#>> a: I am a Bar
#>> b: I am a Module
#>> c: I am a Module
0 голосов
/ 08 июня 2009

Для краткого резюме ... http://paulbarry.com/articles/2008/04/17/the-rules-of-ruby-self

self также используется для добавления методов класса (или статических методов для людей на C # / Java). Следующий фрагмент добавляет метод с именем do_something к текущему объекту класса (статический) ...

class MyClass
    def self.do_something   # class method
       # something
    end
    def do_something_else   # instance method
    end
end
...