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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
クラス定義中のselfは、クラスオブジェクトです。
インスタンスメソッドのselfは、そのクラスのオブジェクトです。
$aにはクラスAが代入されています。
それでtrueになります。
xメソッドはそもそも実行されないと
$bには、値が代入されませんのでnilとなります。
なのでfalseになります。
投稿2014/09/21 07:30
総合スコア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
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。