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

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

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

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

Q&A

解決済

2回答

1300閲覧

puts と p の実行結果のあまりの相違にわからなくなってます。

tuvalu

総合スコア136

Ruby

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

0グッド

1クリップ

投稿2017/07/23 07:30

先日、Rubyの試験に行ってきました。結果は不合格で落ち込んでいます。
と、言っても落ち込んでばかりはいられないので、復習をしようと思い
問題を思い出しながら検証作業をしています。以下のような問題が出たと思います。
(このコードで絶対合っているかと問われれば絶対的な自信はありませんが。。)
self.class の前の表示するメソッドはputsだったと記憶しています

以下のコードを実行した結果を選択してください。
class Foo
puts self.class
def foo
puts self.class
end
end

p Foo.new.foo

  1. Foo
    Foo
  2. Foo
    nil
  3. nil
    nil
  4. nil
    Foo

ぼくは、1.と回答しましただ、
お家に帰ってirbしてみると、どうも正解は2.のようです。。
irb(main):001:0> class Foo
irb(main):002:1> puts self.class
irb(main):003:1> def foo
irb(main):004:2> puts self.class
irb(main):005:2> end
irb(main):006:1> end
Class
=> :foo
irb(main):007:0>
irb(main):008:0* p Foo.new.foo
Foo
nil
=> nil

でも合点がいかないので、puts を p に変えて試したところ、全く違う結果がでました。
irb(main):001:0> class Foo
irb(main):002:1> p self.class
irb(main):003:1> def foo
irb(main):004:2> p self.class
irb(main):005:2> end
irb(main):006:1> end
Class
=> :foo
irb(main):007:0>
irb(main):008:0* p Foo.new.foo
Foo
Foo
=> Foo

p と puts でこんなにも結果が違うものなのでしょうか?
それと、この問題の意図からして正解はどうあるべき(どちら)なのでしょうか?
もしくは、覚えていたという問題は完璧な誤りでこうであるはずだ!というのがあれば教えて頂きたいです。
こんな変な質問ですが、おつきあい頂ける方、ご指導よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

putspも、「表示する」と言うことが目的なので、もともと戻り値はどちらもnilでした。
ただ、デバッグなどで便利では無いかと言うことで、Ruby1.9からpの戻り値は引数になりました。
ということで、2つのメソッドの戻り値に差が出ました。

Ruby

1class Foo 2 puts self.class 3 def foo 4 puts self.class 5 end 6end 7 8p Foo.new.foo

だと、出力結果は、

Class Foo nil

ですね。

投稿2017/07/23 08:41

otn

総合スコア84498

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

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

tuvalu

2017/07/24 23:41

ご回答ありがとうございます。otnさんともうひとかたbamboorianさんの回答でようやくわかりました。 クラス定義でputs を呼び出しているのに、インスタンスを作るときに p を入れているので、 結果が3つも表示されてしまいました。問題では表示結果は2つでした。僕の覚え間違いの御指摘 (p Foo.new.foo ではなく、Foo.new.foo 、というのと、あと選択肢の覚え間違い)と 次につながる回答を頂いたので、誠に恐縮ですが、bamboorianさんの方をベストアンサー とさせて頂きます。本当にありがとうございました。また、よろしくお願い致します。
guest

0

ベストアンサー

他の回答の通り、解答例の覚え間違いと思います。

1つ目のputsはFooクラスは何クラスのオブジェクトか?
2つ目のそれは、Foo.newしたオブジェクト(Fooインスタンス)が何クラスのオブジェクトか?ということなので、

Classクラス
Fooクラス
という回答になります

あと、私は、試験の勉強ではirb経由ではなく、
rubyファイルをコマンドで実行するくせをつけてました。

$ ruby hoge.rb

投稿2017/07/24 05:19

bamboorian

総合スコア34

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

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

tuvalu

2017/07/24 23:57

ご回答ありがとうございます。ようやくわかりました。 期待されている解答は、Class と Foo なので、選択肢は覚え間違い。 p Foo.new.foo の p も覚え間違いで不要で誤り、puts や p に惑わされているようではダメですね。。 ありがとうございました。またよろしくお願い致します。
tuvalu

2017/07/24 23:59

あっ、あと、irbの件、勉強になりました。 今後、ファイルを実行します。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問