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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Q&A

解決済

2回答

1270閲覧

Ruby 出力がtruefalseになる理由

mikntjy

総合スコア26

Ruby

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

0グッド

0クリップ

投稿2014/09/20 06:52

lang

1class A 2$a = self 3 4def x 5$b = self 6end 7end 8a = A.new 9puts A == $a, A.new == $b

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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

投稿2014/09/21 07:30

monjayaki

総合スコア104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

次のように コードを変更してみました。

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 をいれて代入文がどのように実行されているかをしらべてみます。

lang

1class A 2 $a = self 3 puts "#--- setted $a" 4 def x 5 $b = self 6 puts "#--- setted $b" 7 end 8end 9 10a = A.new 11puts A == $a, A.new == $b

このプログラムの出力は次のようになります。

#--- setted $a true false

$a への代入が一度行われているだけ, $b への代入は行われていないということがわかります。

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

投稿2014/09/22 22:59

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikntjy

2014/09/25 00:49

丁寧に教えて頂いたので、理解できました!! 回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問