2009-06-08 1 views
26

Быстрый вопрос относительно использования «САМОГО» внутри модуля или библиотеки. В основном, какова область/контекст «SELF», поскольку она относится к модулю или библиотеке и как ее правильно использовать? Для примера того, что я говорю, проверьте модуль «AuthenticatedSystem», установленный с «restful_authentication».(Ruby, Rails) Контекст SELF в модулях и библиотеках ...?

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

ответ

44

В модуле:

Когда вы видите 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 
+1

Точно. Все это объект в Ruby. Код места не может быть выполнен, если нет я. – Chuck

+0

Понял, так тогда какова цель/цель вызова себя в модуле? –

+0

Привет всем, Все еще ищете явный ответ. Я понимаю, что SELF * может * сделать. Что мне нужно знать, это то, что он делает * в функции модуля? Я бы предположил, что какой-то тип переменной задан глобально, но я не уверен, что это так. Может ли кто-нибудь подтвердить/просветить? –

0

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

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

class MyClass 
    def self.do_something # class method 
     # something 
    end 
    def do_something_else # instance method 
    end 
end 
Смежные вопросы