0
class MyClass
  def MyFun
    puts self
  end
end

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

module、class、defはすべてスコープを変更するため、ここではdef ... end内にあるため、selfはMyClassではなくMyFunである必要があります。なぜまだMyClassに残っているのですか?

4

3 に答える 3

0

self現在のコンテキストオブジェクトです。MyFunはオブジェクトではなく、メソッドです。具体的には、MyClassのインスタンスメソッドです。したがって、の中MyFunselfは、を実行しているMyClassのインスタンスがありますMyFun

于 2013-03-26T21:08:44.857 に答える
0

あなたの例MyFunではインスタンスメソッドであるためself、実際にはのインスタンスですMyClass

戻ってきているのは、実際にはインスタンスリテラルですmine.MyFunそれがクラスリテラルである場合、それは明らかにjsutになりますMyClass。自分でテストする

class Example
  def asdf
    self
  end
end

Example.new.asdf.class #=> Example
于 2013-03-26T21:11:41.897 に答える
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>>"
于 2013-03-27T04:47:51.173 に答える