2013-03-26 7 views
0
class MyClass 
    def MyFun 
    puts self 
    end 
end 

mine = MyClass.new 
mine.MyFun # => #<MyClass:0x10a3ee670> 

Поскольку модуль, класс, определяет все области изменения, здесь я должен быть MyFun вместо MyClass, поскольку он находится внутри def ... end. Почему все еще остается в MyClass?Почему я сам - MyClass?

+2

Я не эксперт рубин, но не MyFun метод, а не класс? self ссылается на экземпляр объекта, а не на имя метода. – rickerbh

ответ

0

объем self:

Внутри определения класса self всегда class constants(instance of Class) сам (за исключением методов экземпляра)..

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

p RUBY_VERSION 

class Foo 

    def self.talk 
    p "here SELF is-> #{self}" 
    end 

    def display 
    p "here SELF is-> #{self}" 
    end 

    p "here SELF is-> #{self}" 

end 
Foo.talk 
foo = Foo.new 
foo.display 
class << foo 
p "here SELF is-> #{self}" 
end 

Выход:

"2.0.0" 
"here SELF is-> Foo" 
"here SELF is-> Foo" 
"here SELF is-> #<Foo:0x1fc7fa0>" 
"here SELF is-> #<Class:#<Foo:0x1fc7fa0>>" 
0

self - текущий объект контекста. MyFun - это не объект, а метод - в частности, это метод экземпляра MyClass. Таким образом, внутри MyFun, self будет экземпляр MyClass, который выполняет MyFun.

0

В вашем примере MyFun является методом экземпляра, поэтому self фактически является экземпляром MyClass.

Это вещьmine.MyFun Возвращение является фактом экземпляра буква. Если бы это был классный литерал, это было бы явно MyClass. Проверьте сами

class Example 
    def asdf 
    self 
    end 
end 

Example.new.asdf.class #=> Example 
+0

Это не буквальный, это просто строка, возвращаемая 'inspect'. Вы не можете выполнить '# .MyFun', чтобы снова вызвать метод. – Chuck

+0

Yeap, с правой стороны, я поместил часть 'puts'. Однако это будет работать с моим примером. – nicooga

Смежные вопросы