2

で誰が の役割を果たしているのかを確認するためにselfnested methods次のコードを試しました。

def test
  p "#{self}"
  def show
    p "#{self}"
  end
end
# => nil

効果として、以下の 2 つのオブジェクトを取得しました。

Object.new.test
"#<Object:0x00000002212d78>"
# => nil
Object.new.test.show
"#<Object:0x00000002205330>" #<~~~ this is self understood
"" #<~~~ how this one came?
# => ""

しかし、エンコードされた数値からは、それらのオブジェクトがどのクラスに属しているかを理解できませんでした。そして、以下のコードを試して、それぞれclassの名前を取得しました。

Object.new.test.class
"#<Object:0x000000021ff3b8>"
# => NilClass
Object.new.test.show.class
"#<Object:0x000000020660b0>"
""
# => String

class上記のコードがこれらの名前をどのように生成したかの概念を理解するのを手伝ってくれる人はいますか?

編集

ここで、より具体的な方法で質問をしようとしました:

def test
p "First level # => #{self}"
def show
p "Second level # => #{self}"
end
end
# => nil
Object.new.test.show
"First level # => #<Object:0x000000014a77b0>"
"Second level # => "
# => "Second level # => "
Object.new.test.show.class
"First level # => #<Object:0x0000000130ef70>"
"Second level # => "
# => String

p "Second level # => #{self}"声明self""価値があるのはなぜですか?

4

5 に答える 5

3

Object.new.test.show は、Object.new.test オブジェクトの show メソッドを呼び出します。

Object.new.test は (p が nil を返すように) nil を返しますが、同時に、show メソッドの定義を Object クラスに追加します。

nil は Object のサブクラスである NilClass クラスであるため、nil はメソッドとして show を持つようになったため、nil で実際に show を呼び出すことができます。

あなたがするとき Object.new.test.show は同等です

nil.show

show 内で p "#{self}" を実行すると、実際には nil.to_s が出力されます。

nil.to_s is ""

それはあなたが見る不思議な「」を説明しています。

于 2013-02-26T19:42:51.353 に答える
1

それはかなり簡単です:

def show
  p "#{self}"
end

nil、つまりパーツを返します。これが、メソッドがオブジェクト、つまりのインスタンスを返すdef理由です。メソッド内で、クラスのインスタンスである文字列オブジェクトを返すことを実行しています。testnilNilClassshowp "#{self}"String

于 2013-02-26T18:05:53.483 に答える
1

これを試して :

class FooBar
  def foo
    puts self.class
    puts self
    def bar
      puts self.class
      puts self
    end
    bar
  end
end


FooBar.new.foo

私が得た:

FooBar
#<FooBar:0x007fc413849818>
FooBar
#<FooBar:0x007fc413849818>

異なるオブジェクトを割り当てたため、異なる結果が得られました。

selfネストされたメソッドであっても、メソッドが定義されているオブジェクトを返します。

于 2013-02-26T18:07:45.543 に答える
0

使用してみてください:self.class.to_s。SOは私に余分な文字を入力してほしいので、[:

于 2013-02-26T18:06:16.693 に答える
0

私たちは皆それを知っています - self inside a method is always the object on which the method was called。それでは、その真偽を検証してみましょう。

selfまず、以下のコードから誰がデフォルトであるかを見てみましょう:

m=self
# => main
m.class
# => Object

さて、デフォルトselfObjectクラスのオブジェクトです。

概念を強調するために、記述されたコードから、より単純な方法で以下のコードを記述しました。

def test
p self.class
def show
p self.class
end
end
# => nil

self inside a method is always the object on which the method was called以下のようにのみ呼びますので注意してtestください。

test
Object
# => nil

はい、Objectが呼び出されて返されました。これtestは、上記のステートメントが真であることを意味します。

test.show
Object
NilClass
# => NilClass

への呼び出しも、ブロックによりtest返されます。現在は のオブジェクトです。したがって、メソッドはオブジェクトで呼び出されました。結果としてはです。ここでも上記のステートメントが成り立ちます。nildef show;p self.class;endnilNilClassshowNilClassselfNilClass

上記の概念を使用して、小さなステップで実際の目標に到達しようとしています。

def test
p "1. # => #{self}"
def show
p "2. # => #{self}"
end
end
# => nil

test
"1. # => main" #<~~ main is an object of class Object,on which test was called from IRB.
# => nil

test.show
"1. # => main"
"2. # => "    #<~~ nil("" means nil.to_s) is an object of Nilclass,on which show was called from IRB.
# => "2. # => "
于 2013-02-26T20:06:55.747 に答える