質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • Ruby

    7306questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby 出力がtruefalseになる理由

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 600

mikntjy

score 44

class A
$a = self

def x
$b = self
end
end
a = A.new
puts A == $a, A.new == $b

というコードがあるのですが、
これを実行するとtruefalseになるのです。
この結果になる理由がわからないので
どなたか解説お願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

クラス定義中のselfは、クラスオブジェクトです。
インスタンスメソッドのselfは、そのクラスのオブジェクトです。
$aにはクラスAが代入されています。
それでtrueになります。
xメソッドはそもそも実行されないと
$bには、値が代入されませんのでnilとなります。
なのでfalseになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

次のように コードを変更してみました。
 1    require 'pp'
 2    
 3    class A
 4      $a = self
 5    
 6      def x
 7        $b = self
 8      end
 9    end
10    
11    pp $a.inspect   # => "A"
12    pp $b.inspect   # => "nil"
13    puts
14    
15    a = A.new
16    puts
17    pp $a.inspect   # => "A"
18    pp $b.inspect   # => "nil"
19    
20    a.x
21    puts
22    pp $a.inspect   #  => "A"
23    pp $b.inspect   #  => #<A:0x007fa8a18f1c08>
24    
25    puts
26    pp A.new        #  => #<A:0x007fa8a18f08a8>
27    pp a            #  => #<A:0x007fa8a18f1c08>
# => には プログラムを実行した時の出力行を書いてあります。
このプログラムの出力結果が理解できれば、質問にあったコードの出力結果が理解できるはずです。

  • 11 行目 $a は A.new の実行前に既に 設定されます。
  • 15 行目で a = A.new を実行していますが、実行後でも $b には まだ値が設定されていません。
  $b の設定は メソッド x を実行するまでは 実行されないからです。

  • 20 行目の a.x を実行すると, $b の値が設定されます。
  • 26 行目で A.new を行うと、新たに A のインスタンスが作成されます。
  そのインスタンスは、 15 行目で a = A.new で作成したインスタオンスとは異なるものになります。


では 質問にあったコードのクラス定義中に puts をいれて代入文がどのように実行されているかをしらべてみます。
class A
  $a = self
  puts "#--- setted $a"
  def x
    $b = self
    puts "#--- setted $b"
  end
end

a = A.new
puts A == $a, A.new == $b

このプログラムの出力は次のようになります。
#--- setted $a
true
false
$a への代入が一度行われているだけ, $b への代入は行われていないということがわかります。

なぜ、そのような動作になるかについては、ruby のクラス、メソッド、クラス変数 について 入門書などを参照してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/09/25 09:49

    丁寧に教えて頂いたので、理解できました!!

    回答ありがとうございました!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7306questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。