はじめに
「プロを目指す人のためのRuby入門」(通称チェリー本)の2章を学習しました。
本記事では2.6「メソッドの定義」で学んだことをまとめます。
※最後に理解を深めるためのクイズも用意しています。
想定読者
- Rubyを学び始めたばかりの人
- メソッドの定義や戻り値の概念を整理したい人
メソッドの定義
Rubyではdef〜endでメソッドを定義します。
def sum(price, tax)
price + tax
end
puts sum(1000, 100) # => 1100
メソッド名はスネークケースで書くのがRubyの慣習です。
# Good
def user_name
end
# Bad(Rubyではキャメルケースは使わない)
def userName
end
戻り値
メソッドを呼び出したときに返ってくる値を戻り値と言います。
Rubyの特徴として、最後に評価された式が自動的に戻り値になります。
JavaやPHPのように必ずreturnを書く必要はありません。
def welcome_message(language)
if language == 'japanese'
'こんにちは' # languageが'japanese'の場合の戻り値
else
'hello' # それ以外の場合の戻り値
end
end
puts welcome_message('japanese') # => こんにちは
puts welcome_message('english') # => hello
returnの使いどころ
Rubyにもreturnはあります。ただし使い方が他言語と異なります。
メソッドの最後では使わない
# Bad(冗長)
def sum(price, tax)
return price + tax
end
# Good(Rubyらしい)
def sum(price, tax)
price + tax
end
ガード節で使う
returnが活きるのはメソッドを途中で打ち切りたい場面です。
異常なケースを先に弾くこの書き方をガード節と呼びます。
ネスト(入れ子)を減らすことで、コードの可読性を高める書き方です。
def welcome_message(language)
return '言語を入力してください' if language.nil? # 異常ケースを先に弾く
if language == 'japanese'
'こんにちは'
else
'hello'
end
end
puts welcome_message(nil) # => 言語を入力してください
puts welcome_message('japanese') # => こんにちは
ガード節を使わないと入れ子が深くなり、読みにくいコードになります。
# ガード節なし(読みにくい)
def welcome_message(language)
if language.nil?
'言語を入力してください'
else
if language == 'japanese'
'こんにちは'
else
'hello'
end
end
end
デッドコードに注意
returnの後に書いたコードは実行されないので要注意です。
def total_price(price, quantity)
result = price * quantity
return result
puts "計算しました" # ← ここには絶対に到達しない(デッドコード)
end
正しくはこう書きます。
def total_price(price, quantity)
result = price * quantity
puts "計算しました"
result # returnは不要
end
()のルール
Rubyではメソッド呼び出し時の()を省略できます。
ただし、可読性のために次のような書き方がよく使われます。
| 場面 | 主流 | 例 |
|---|---|---|
| 引数なしのメソッド定義 | 省略する | def user_name |
| 引数ありのメソッド定義 | つける | def welcome_message(language) |
| メソッドの呼び出し | 省略することが多い | puts user_name |
まとめ
- メソッド名はスネークケースで書く
- Rubyは最後の式が自動的に戻り値になる
- メソッドの最後で
returnは不要 -
returnはガード節(途中で処理を打ち切る)で使う -
()は引数があるときにつける、ないときは省略
理解度チェッククイズ
Q1. 以下のメソッドの戻り値は何ですか?
def sum(price, tax)
price + tax
end
sum(1000, 100)
答えを見る
A. 1100Rubyは最後に評価された式が戻り値になります。returnは不要です。
Q2. 以下のコードの問題点はどこですか?
def total(price, quantity)
result = price * quantity
return result
puts "計算完了"
end
答えを見る
return result の後に puts "計算完了" があるため、puts は絶対に実行されません。
これをデッドコードと言います。
正しくはこう書きます。
A.
def total(price, quantity)
result = price * quantity
puts "計算完了"
result
end
Q3. returnを使うべき場面はどんな時ですか?
答えを見る
A. ガード節として、異常なケースを先に弾いてメソッドを途中で打ち切りたい時に使います。
def welcome_message(language)
return '言語を入力してください' if language.nil?
if language == 'japanese'
'こんにちは'
else
'hello'
end
end
Q4. 以下のうちRubyの慣習として正しい書き方はどれですか?
# A
def userName
end
# B
def user_name
end
# C
def UserName
end
答えを見る
A. B def user_name
Rubyのメソッド名はスネークケースで書くのが慣習です。
- キャメルケース(userName)はJavaなどの慣習でRubyでは使いません。
- アッパーキャメルケース(UserName)はRubyではクラス名に使います。
Q5. 引数ありのメソッドを定義するとき、()はつけますか?
答えを見る
A. つけます。
# Good
def welcome_message(language)
end
# 省略できるが慣習としてつける
def welcome_message language
end
# 引数がない場合は省略するのが主流。
def user_name # Good
end
参考
本記事は以下の書籍をもとに学習内容を整理しています。
- 「プロを目指す人のためのRuby入門」