この話はRuby 1.8.6を前提としています。
先日「
[PHP]echoとprintの違いを再確認」というエントリで、echoとprintの違いを確認したばかりですが、折角なのでRubyのputsとprintの違いも確認してみようと思います。
・どちらもRubyの組み込み関数
・括弧で括っても括らなくても使える
※注釈1 ○ puts 'hoge';
○ print 'hoge';
○ puts ('hoge');
○ print ('hoge');
・どちらも返り値は常に「nil」を返す
・どちらも複数のパラメータを渡せる
○ puts 'hoge', a, 'fuga'
○ print 'hoge', a, 'fuga'
○ puts ('hoge', a, 'fuga')
○ print ('hoge', a, 'fuga')
・putsのみ引数を出力した後、続けて改行を出力する
▼「puts 'aaaa', 'bbbb', 'cccc'」の実行結果
----------------------------------------
aaaa
bbbb
cccc
▼「print 'aaaa', 'bbbb', 'cccc'」の実行結果
----------------------------------------
aaaabbbbcccc
・末尾が改行(\n)で終わっている引数に対して、printは末尾の改行を出力するが、putsは末尾の改行を出力しない
▼「puts "aaa\nbbb\nccc\n", 'ddd', 'eee'」の実行結果
----------------------------------------
aaa
bbb
ccc
ddd
eee
(aaaとbbbの後ろの\nは出力されているが、cccの後の\nが出力されていない)
▼「print "aaa\nbbb\nccc\n", 'ddd', 'eee'」の実行結果
----------------------------------------
aaa
bbb
ccc
dddeee
(cccの後の\nも出力されている)
・ちなみに末尾に改行(\n)がたくさんあった場合も、「末尾の改行だけが出力されない」ことに変わりはありません
▼「puts "改行が後ろに3つあります\n\n\n"
puts "空行は幾つありますか?"」の実行結果
----------------------------------------
改行が後ろに3つあります
空行は幾つありますか?
(1つ目の\nと2つ目の\nが出力され、3つ目の\nは出力されず、
そしてputsは引数を出力した後に続けて改行を出力するので空行が2行になる)
・文字列以外の引数を渡すと、printは先ずto_sメソッドで文字列に変換してから出力し、
putsは先ずto_aryメソッドで配列に変換を試み、次にto_sメソッドで文字列に変換してから出力する
・どちらも引数にnilを渡すと、文字列の「nil」を出力する
・どちらも引数は省略可能
○ puts '' ⇒ 改行のみ出力される
○ puts ⇒ 改行のみ出力される
○ print '' ⇒ 何も出力されない
○ print ⇒ 引数が与えられないと、変数「$_」の値を出力する
「$_」は最後にgetsまたはreadlineで読み込んだ文字列を保持しており、
何も読み込んでいない場合はnilを返す
▼「print; puts '名前を入力してください'; name = gets.chomp; print」の実行結果
----------------------------------------
nil名前を入力してください
hoge
hoge
(最初のprintはnilを返し、getsで文字列を読み込んだ後のprintは
「$_」に保持していたhogeを返している)
※注釈1Rubyのリファレンスには括弧がついた状態で書いてあるけど、本ではつけていない状態が多い。
暗黙的に「省略できる括弧は省略する」というポリシーが普及しているのだろうか?
この点をご存知の方がいらしたら教えてください。かなり細かい話ですが、特に最後の「printは引数をつけないと$_を返す」などは、知らないままこの挙動に遭遇するとちょっと驚きます。
リファレンスって面白いなー、電車の時刻表を眺めて楽しそうにしている人と、そう大差ない感覚かも知れない。
ここでの情報は「
オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル」を参考にしています。
putsのリファレンスprintのリファレンス$_のリファレンス併せてこちらもご覧頂き、間違いや不足している点がありましたら、コメントにてお知らせ頂ければと思います。
テーマ : プログラミング
ジャンル : コンピュータ