2012/03/06

print / puts / p の出力と返り値について

こんがらがるのでメモ。

それぞれで出力結果と返り値が異なる

それぞれ単体で動かしてみる。

print
>> print "test"
test=> nil    # testが出力され、返り値はnil
puts
>> puts "test"
test    # testが出力されて改行される
=> nil    # 返り値はnul
p
>> p "test"
"test"    # テキストオブジェクトが出力される
=> "test"    # 返り値にもテキストオブジェクトが入る
ここからわかるのは
・printとputsは改行がある程度で大きく変わらない。(putsは文字列の最後で改行)
・pは返り値を持ちつつ、オブジェクトが属するクラス情報も保持している。


出力と返り値の関係を理解するためにいろんなパターンで動きを見てみる。

print puts "test"

puts が test を出力して改行。putsの返り値 nil が print に引き渡され、print の出力は何もなし、返り値はnil

実行結果
>> print puts "test"
test
=> nil

print p "test"

pが"test"を出力して改行。pの返り値"test"がprintに引き渡され、printがtestを出力し、返り値はnil

実行結果
>> print p "test"
"test"
test=> nil

puts p "test"

pが"test"を出力して改行。pの返り値"test"がputsに引き渡され、putsがtestを出力して改行。返り値はnil

実行結果
>> puts p "test"
"test"
test
=> nil

puts print "test"

printがtestを出力。printの返り値nilがputsに引き渡され、putsの出力は何もなしで改行。返り値はnil

実行結果
>> puts print "test"
test
=> nil

p print "test"

printがtestを出力。printの返り値nilがpに引き渡され、pはnilを出力して改行。返り値はnil

実行結果
>> p print "test"
testnil
=> nil

p puts "test"

putsがtestを出力して改行。putsの返り値nilがpに引き渡され、pはnilを出力して改行。返り値はnil

実行結果
>> p puts "test"
test
nil
=> nil

0 件のコメント:

コメントを投稿