

ruby 2.2.1p85  
mac Mavericks

* * *

Ruby言語の質問になります。

以下のソースコードを実行した結果、分からないことが2点あります。  
① グローバル変数$bの出力結果が何故「nill」になるのか。  
② hoge2メソッドを呼び出した際に、何故「A.new == self」がtrueにならないのか。

[code]

    class A
        $a = self
        def hoge
            $b = self
        end
    
        def hoge2
            puts self   
            puts A == self
            puts A.new == self
        end
    end
    
    puts A == $a, A.new == $b
    p $a
    p $b
    A.new.hoge2
    
[/code]

実行結果は以下になります。

[code]

    true
    false
    A
    nil
    #<A:0x007fd8ab82a088>
    false
    false
    
[/code]

以上です。  
よろしくお願いします。


CC BY-SA 3.0
2016-01-27T15:39:25.960
21401
2016-01-27T17:06:23.817
2016-01-27T16:38:30.490
754
12912
question
ruby
Rubyのselfについて


# 1\. への答え:

hoge メソッドが、上記のソースコードでは一度も実行されていないからです。例えば、

[code]

    A.new.hoge
    
[/code]

を一度でも実行すれば、`$b` は`A`クラスのオブジェクトを示すようになります。もっというと、 `def`
で定義されるメソッドは、実際にそのメソッドが呼び出されるまでは一度たりとて実行されません。

# 2\. への答え:

new メソッドは、新しくそのクラスのオブジェクトを生成するためのメソッドです。 `A.new == self`
の行では何を比較していることになるかというと、今まさにその行の`A.new`で生成されたオブジェクトと、`A.new.hoge2`の`A.new`で生成されたオブジェクト(そして、これが`A.new
== self`での self が表すオブジェクト)が、同じオブジェクトであるかどうかを比較しています。

例えば、次のコードを実行すると、

[code]

    class A
        def hoge2
            puts self
            puts A == self
            local_a_object = A.new
            puts local_a_object
            puts local_a_object == self
        end
    end
    
    a_object = A.new
    
    a_object.hoge2
    
[/code]

結果として次を得ます。

[code]

    #<A:0x007fe3141af5f0>
    false
    #<A:0x007fe3141af4b0>
    false
    
[/code]

`0x007fe...`の記号は、オブジェクトのidです。`hoge2`では違うオブジェクトを比較しているので、`==`の結果が`false`になっています。

# `self` とは

メソッドの中においては、`self`はそのメソッドが呼び出されているオブジェクトを指します。クラス定義(ないしモジュール定義)の中においては、`self`はその定義されているクラスないしモジュール自身を指します。

# 参考図書:

メタプログラミング ruby を読むと、ここらへんのことに詳しくなれる、かもしれないです。


CC BY-SA 3.0
2016-01-27T16:18:27.903
21402
2016-01-27T17:06:23.817
2020-06-17T08:14:45.997
-1
754
21401
answer