はじめに
Rubyの学習をしていると、
- 「リテラルを使いましょう」
- 「newよりリテラルの方がRubyらしい」
- 「文字列はString.newではなく"hello"で書こう」
といった説明を見かけることがあります。
私は最初、
リテラルって何?
String.newと何が違うの?
と思っていました。
この記事では、Ruby初心者向けに
- リテラルとは何か
- newとの違い
- どんなときにnewを使うのか
をわかりやすく解説します。
リテラルとは?
リテラルとは、
プログラムの中にそのまま書ける値
のことです。
もっと簡単に言うと、
「書いた瞬間に使えるデータ」
になります。
リテラルの例
数値リテラル
10
3.14
数値をそのまま書いています。
文字列リテラル
"こんにちは"
'hello'
文字列をそのまま書いています。
配列リテラル
[1, 2, 3]
ハッシュリテラル
{name: "Mark", age: 25}
newとの違いは?
Rubyではオブジェクトを生成するときに new を使います。
例えば次のようなコードです。
String.new("hello")
Array.new([1, 2, 3])
一方で、多くの場合は次のようにも書けます。
"hello"
[1, 2, 3]
つまり、
String.new("hello")
より
"hello"
の方がシンプルということがわかります。
なぜリテラルが推奨されるの?
理由は大きく2つ
理由① コードが短くなる
例えば文字列の場合。
"hello"
と
String.new("hello")
を比べると、前者の方が圧倒的に読みやすいことがわかるかと思います
理由② Rubyらしい書き方だから
Rubyは
「人間が読みやすいコードを書くこと」
を大切にしている言語です。
そのため、
リテラルで表現できるものはリテラルで書くのが一般的です。
ではnewはいつ使うの?
リテラルでは表現できない作り方をしたいとき
にnewを使います。
① 配列を指定サイズで作りたいとき
例えば3個分の空要素を持つ配列を作る場合。
Array.new(3)
結果
[nil, nil, nil]
このような書き方はリテラルではできません。
② 同じ値で埋めたいとき
Array.new(3, "a")
結果
["a", "a", "a"]
リテラルでも書けますが、
要素数が増えると大変になります。
["a", "a", "a"]
③ 動的に値を作りたいとき
Array.new(3) { |i| i * 2 }
結果
[0, 2, 4]
要素を計算しながら生成できます。
これはリテラルでは表現できません。
④ 空のオブジェクトを作りたいとき
String.new
Array.new
Hash.new
後から値を追加したい場合に利用します。
⑤ 自分で作ったクラスのインスタンスを生成するとき
実務ではこれが最も重要です。
class User
def initialize(name)
@name = name
end
end
user = User.new("Mark")
これはリテラルでは書けません。
クラスからオブジェクトを生成するときはnewが必要になります。
イメージで理解!
リテラルとnewの違いを料理で例えるとこんな感じです。
リテラル
完成品をそのまま買う
🍛 コンビニのカレー
new
材料から作る
👩🍳 自分好みにカレーを作る
つまり、
既に完成しているものならリテラル、
特別な作り方をしたいならnew、
というイメージです。
使い分けまとめ
リテラルを使うケース
値が既に決まっている場合
"hello"
[1, 2, 3]
{name: "Ruby"}
newを使うケース
特別な生成方法が必要な場合
Array.new(10)
Array.new(3) { |i| i * 2 }
User.new("Mark")
まとめ
リテラルとは、
プログラムの中にそのまま書ける値
のことです。
Rubyでは、
- 数値
- 文字列
- 配列
- ハッシュ
などはリテラルで書くのが一般的です。
一方でnewは、
- 特別な初期化をしたい
- 動的に生成したい
- クラスのインスタンスを作りたい
ときに使います。
迷ったらまずは、
「リテラルで書けるならリテラルを使う」
と覚えておくと、わかりやすいかと思います
