【Ruby】puts と print の違いは改行の有無のみではない!?
puts だと改行が入って、print だと改行が入らない!
こんな検索結果を見て、超初心者だった頃は「へ〜〜〜!!」っとなったのを覚えている。
しかし結局矛盾に行き当たる。
puts [ ] と puts { } 、つまり配列とハッシュでは、配列には改行が入り、ハッシュには改行が入らず { } がそのまま出力されるということに対しての説明がつかないのだ。
WHY?
仮に改行を入れているんだという説が正しいとするならば、何を基準に改行を入れているんだということが重要となるハズである。
配列
["A", "B", "C"]
ハッシュ
{"A" => "a" , "B" => "b", "C" => "c"}
まずは、配列同士で比較してみる
puts ["A", "B", "C"]
A
B
C
print ["A", "B", "C"]
["A", "B", "C"]
この時点でもどうやらただ改行が入っているというだけでもなさそうである。
puts は中身を一つずつ("A"ではなく A として)出力
print は右側をそのまんま出力
しているように見える。
続いてハッシュ。
puts {"A" => "a" , "B" => "b", "C" => "c"}
エラーwww
print {"A" => "a" , "B" => "b", "C" => "c"}
エラーwww
・・・ruby の闇に出会う。。
どうやらこのままだとハッシュとして認識してくれないらしく、解説しだすと横道逸れまくりなので、飛ばして以下の方法で代用
puts({"A" => "a" , "B" => "b", "C" => "c"})
{"A"=>"a", "B"=>"b", "C"=>"c"}
print({"A" => "a" , "B" => "b", "C" => "c"})
{"A" => "a" , "B" => "b", "C" => "c"}
どちらも同じ出力となる。
「,(カンマ)」で区切られて改行が入っているという訳ではない。
どうやら、形式的な理由により改行が実行されている訳ではなさそうである。
では、なんなのかというとおそらく「オブジェクト」の捉え方の問題なのだと推察する。
puts においては
配列はオブジェクトの集まり
ハッシュは一つのオブジェクト
として認識されていると考えるとしっくりくる
print は読んで字のごとくただのprint(印字)であり、puts は put (配置)なのだ。
だからオブジェクトを一つずつ、put する。
ただ、改行を入れている訳ではない。
そもそも、改行を入れてたいだけなら何もメソッドとして組み込むほどのものではないだろう。
もちろん、ハッシュにおいて、キーもバリューもそれぞれオブジェクトである。
ただ、どういうまとまりでオブジェクトを扱うかが大事なのだと思う。
改行がなぜ入るのかというと、別なオブジェクトとして扱っているということを表していると考えるのが自然だ。
つまり、配列はその要素内において、それぞれを別のオブジェクトとして捉える。そのため内部の各オブジェクトはその入れた順番によってのみ区別される。
一方、ハッシュはそれ自体が一つのオブジェクトとして捉える。一つのオブジェクトの中身に順位付けはない。
例えば一人の人間をオブジェクトとすれば
年齢、血液型、身長、これらの要素がキーとなる。
各キーに順番はないのである。もちろん配列のように入れた順番で管理することも可能であろうが、ハッシュはそれぞれが、そのハッシュそのものを表す個々の要素であると考えるのが妥当であろうし、そのようにハッシュを使うことによって、一つのオブジェクトとして取り扱うことが可能になるように思える。
逆に配列は、それぞれを別なオブジェクトとして取り扱うからこそ、その中身はどんなオブジェクトであれ入れることが可能なのだろう。
もちろんバラバラなタイプのオブジェクトを一つの配列に詰め込んだとして、どう扱うんだという問題は残るだろうが^^;
しかし、なんだかんだでまだわからないことが多い・・・
勉強します。