【Ruby基礎文法】puts, p, printの使い方

Rubyには、ターミナルなどの画面にログや変数の値などの処理結果を表示するために以下のメソッドが用意されています。

- puts
- p
- print

特に、`puts`と`p`に関しては、ログの表示、テスト、デバッグなど、様々な場面で利用されます。基本的、かつ、非常に汎用性の高いメソッドなので、ぜひ使えるようにしてみてください。

# puts
`puts`は、データを出力する際に、最後に改行が入ります。

## 文字の表示
putsの基本的な使い方は以下の通りです。

```ruby
puts "Hello World!!"
```

以上のように書くと、ターミナルに`Hello World!!`という文字列が表示されます。ここで注意しなければいけないのは、文字列を表示するときは`""（ダブルクウォーテーション）`で囲むということです。これがないと文字列として認識してもらえずエラーになるので注意してください。

それでは実際に、`puts`を使って`Hello World!!`を表示してみましょう。そのためにまずは、Rubyのファイルを作成します。テキストエディタを立ち上げ、`command + s`で保存しましょう。

上書き保存（最初の一回は名前をつけて保存）

```
command + s
```

保存する際、ファイル名は`hello.rb`にしてください。その時に使用する`.rb`は`拡張子`と呼ばれるものです。これにより、どういう種類のファイルなのかをコンピュータに認識させることができます。拡張子には、`.rb`の他にも`Word`ファイルを表す`.docx`や`PDF`ファイルを表す`.pdf`などいろんな種類があります。今回は、Rubyのファイルなので拡張子に`.rb`とつけて保存します。保存先はデスクトップにしてください。

```
hello.rb
```

ファイルが保存できたら、`hello.rb`に以下のコードを書きましょう。また、コードを書いたら必ず`command + s`で上書き保存する癖をつけてください。本当によく使う機能なので、このショートカットキーは覚えていた方がいいです。

```ruby:hello.rb
puts "Hello World!!"
```

ではさっそく、`hello.rb`の中に記述したコードをターミナルから実行してみましょう。まずは、`cd`コマンドを使用して、ターミナルでデスクトップに移動します。

```:ターミナル
cd desktop
```

移動ができたら、以下のコマンドを入力してください。

```:ターミナル
ruby hello.rb
```

実行結果

```:ターミナル
Hello World!!
```

## 数字の表示
`puts`を使って数字を表示するときは以下のように書きます。文字列のように`""`を書く必要はありません。`number.rb`を作成し、以下のコードを書いて実行してみましょう。実行する際は、`cd`コマンドを使用してファイルのある場所まで移動することを忘れず行ってください。もし、デスクトップに移動したい場合は、以下のコマンドを入力します。

```:ターミナル
cd desktop
```

作成したファイルに、以下のコードを書いてください。

```ruby
puts 1
```

実行結果

```:ターミナル
1
```

以下のように書くと式を自動で計算し、その結果を出力してくれます。

```ruby
puts 1 + 3
```

実行結果

```:ターミナル
4
```

このように、Rubyでは足し算した結果を`puts`で出力することもできます。また、足し算だけでなく、引き算、掛け算、割り算などの計算も行えます。良い機会なので、Rubyでの四則演算についてもついでに理解しておきましょう。

## 四則演算
Rubyでの四則演算には以下の種類があり、計算する時に使用される記号は`演算子`と呼ばれます。

|演算子|内容|例|
|---|---|---|
|+|足し算（加算）|2 + 2|
|-|引き算（減算）|3 - 3|
|*|かけ算（乗算）|4 * 4|
|/|割り算（除算）|5 / 5|

ではさっそく`puts`を利用し、四則演算の計算結果を表示してみましょう。

```ruby
puts 2 + 2
puts 3 - 3
puts 4 * 4
puts 5 / 5
```

実行結果

```:ターミナル
4
0
16
1
```

もちろん、演算子は複数続けて記述することもできます。

```ruby
puts 2 + 2 + 2
```

ただし、文字と数字を続けて表示する場合、以下のように書くとエラーになります。

```ruby
puts "2 + 2 = " + 4
```

実行結果

```:ターミナル
TypeError: no implicit conversion of Fixnum into String
```

その理由は、「文字」と「数字」という種類の異なるデータで計算を行おうとするため、正常に処理することができなくなってしまうからです。もし、上記のやり方でエラーを回避したい場合は、`to_s`メソッドを使用して数字を文字に変換してあげます。

```ruby
puts "2 + 2 = " + 4.to_s
```

実行結果

```:ターミナル
2 + 2 = 4
```

このように、「文字」と「数字」という種類の異なるデータを表示する場合は特別な変換をしてあげる必要があります。そして、変換が必要かどうかを判断できるようなるためにはオブジェクトの種類を理解しておく必要があります。

# オブジェクト
Rubyには、以下のようなクラスが存在します。一度に全て覚える必要はないですし、使っていくうちにだんだん覚えるものなので、最初は「こういうクラスがあるんだな」くらいの認識で大丈夫です。さらっと確認してみてください。

|クラス|オブジェクト名|
|---|---|
|整数|Integer|
|少数|Float|
|文字列|String|
|配列|Array|
|連想配列|Hash|
|true|TrueClass|
|false|FalseClass|
|nil(存在なし)|NilClass|


それぞれのデータ型に対応するオブジェクトは、`.class`というメソッドで確認することができます。`#`の部分はコメントを記述するときの書き方で、それを書いた行はプログラムのコードとして認識されません。なので、好きなように自分のメモを残すことができ、コードがかなり読みやすくなります。ぜひ使用してみてください。

```ruby
# 整数
puts 1.class
# 少数
puts 1.0.class
# 文字列
puts "文字列".class}
# 配列
puts [1, 2, 3].class
# 連想配列
{"key" => "value"}.class
# true
true.class
# false
false.class
# nil（存在なし
nil.class
```

出力結果

```:ターミナル
Fixnum
Float
String
Array
Hash
TrueClass
FalseClass
NilClass
```

プログラミングでは以上のようなクラスの違いを意識する必要がありますが、今は「文字列」と「数字」だけ把握していれば大丈夫です。

# p
`puts`の場合は出力されたデータがどのデータ型かわかりませんでした。しかし、`p`メソッドを利用すると、データ型の種類を確認することができます。

```ruby
p "こんにちは"
p 1
```

実行結果

```
"こんにちは"
1
```

`puts`と`p`を比較してみると、`p`を利用するメリットがわかりやすいかと思います。

```
puts "1"
p "1"
```

実行結果

```
1
"1"
```

以上のように、`puts`で出力すると`1`という値が文字列なのか数字なのか判断できないのですが、`p`で出力するとそれが文字列だとわかります。このように、プログラムの中で使用されているデータがどのデータ型なのかを把握したい場合、`p`がとても役に立ちます。

# print
`print`は、改行を行わずに処理結果を表示するメソッドです。そこまで使用頻度は高くないので、特に意識して覚える必要はありません。`print`に関しては、`puts`と比較すると違いがわかりやすいので以下のコードを書いてみましょう。

```ruby
puts "私の"
puts "名前は"
puts "神里です。"
puts "-----------"
print "私の"
print "名前は"
print "神里です。"
```

# 複数のデータを出力
`puts` `p` `print`に関しては、複数の値を出力させることも可能です。

```ruby
puts "お", "は", "よ", "う"
p "お", "は", "よ", "う"
print "お", "は", "よ", "う"
```

実行結果

```:ターミナル
お
は
よ
う
"お"
"は"
"よ"
"う"
おはよう
```

# ヒアドキュメント
複数行の文字を出力したい場合、もちろん`puts`でも可能なのですが、ヒアドキュメントを使用するともっと楽になります。ヒアドキュメントの基本的な書き方は以下の通り。

```ruby
puts <<~TEXT
私の
名前は
神里です
TEXT
```

実行結果

```:ターミナル
私の
名前は
神里です
```

`puts`と比べると、ヒアドキュメントの方がはるかに楽なのがわかるかと思います。

```ruby
# putsを使用した場合
puts "おはよう"
puts "こんにちは"
puts "こんばんは"

# ヒアドキュメントを使用した場合
puts <<~TEXT
おはよう
こんにちは
こんばんは
TEXT
```

実行結果

```:ターミナル
おはよう
こんにちは
こんばんは
おはよう
こんにちは
こんばんは
```

ちなみに、ヒアドキュメントを使用する際に文字列を`TEXT`で囲んでいるのですが、こちらは同じワードを使用して入れば記号以外ならなんでも大丈夫です。

```ruby
puts <<~TEXT
おはよう
こんにちは
こんばんは
TEXT

puts <<~亜亜亜
おはよう
こんにちは
こんばんは
亜亜亜

puts <<~あああ
おはよう
こんにちは
こんばんは
あああ

puts <<~aaa
おはよう
こんにちは
こんばんは
aaa

puts <<~111
おはよう
こんにちは
こんばんは
111
```

実行結果

```
おはよう
こんにちは
こんばんは
おはよう
こんにちは
こんばんは
おはよう
こんにちは
こんばんは
おはよう
こんにちは
こんばんは
おはよう
こんにちは
こんばんは
```

途中の改行も、ちゃんと反映されます。これを`puts`でやるとかなりめんどくさい。

```ruby
# putsを使用した場合（空文字で改行）
puts "おはよう"
puts ""
puts "こんにちは"
puts "こんばんは"

# ヒアドキュメントを使用した場合（Enterで改行）
puts <<~TEXT
おはよう

こんにちは
こんばんは
TEXT
```

実行結果

```
おはよう

こんにちは
こんばんは
おはよう

こんにちは
こんばんは
```

以上のように、ヒアドキュメントを利用すると`puts`を連打するより複数行のデータ出力がかなり楽になります。

# まとめ
今回は、入出力に関して以下のメソッドについて学びました。

- puts
- p
- print

これらのメソッドは、現場でもいろんな場面で利用されます。うまく使いこなせれば開発が楽になるので、ぜひ使ってみてください。