为什么自我是MyClass?

时间:2013-03-26 21:04:51

标签: ruby

class MyClass
  def MyFun
    puts self
  end
end

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

由于module,class,def都改变了范围,所以self应该是MyFun而不是MyClass,因为它在def ... end里面。为什么它仍然留在MyClass?

3 个答案:

答案 0 :(得分:0)

self是当前的上下文对象。 MyFun不是一个对象,而是一个方法 - 具体来说,它是MyClass的实例方法。因此,在MyFun内,self将是正在执行MyFun的MyClass的实例。

答案 1 :(得分:0)

在您的示例中,MyFun是一个实例方法,因此self实际上是MyClass的一个实例。

返回的 thing mine.MyFun实际上是实例文字。如果它是一个类文字,它将明显地MyClass。自己测试

class Example
  def asdf
    self
  end
end

Example.new.asdf.class #=> Example

答案 2 :(得分: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>>"