class MyClass
def MyFun
puts self
end
end
mine = MyClass.new
mine.MyFun # => #<MyClass:0x10a3ee670>
由于module,class,def都改变了范围,所以self应该是MyFun而不是MyClass,因为它在def ... end里面。为什么它仍然留在MyClass?
答案 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>>"