💎
【Ruby 6日目】基本文法 - メソッド定義
はじめに
Rubyにおけるメソッドの定義方法について解説します。Ruby 3.4では様々な記法が使えます。
基本概念
メソッドはdef
キーワードで定義します。主な特徴:
- 引数のデフォルト値を設定可能
- 可変長引数(*args)
- キーワード引数
- ブロック引数(&block)
- Endless method定義(Ruby 3.0+)
- 戻り値は最後に評価された式(returnは省略可)
使い方
# 基本的なメソッド定義
def greet(name)
"Hello, #{name}!"
end
puts greet("Alice") #=> Hello, Alice!
# デフォルト引数
def greet(name = "World")
"Hello, #{name}!"
end
puts greet #=> Hello, World!
# 可変長引数
def sum(*numbers)
numbers.reduce(0, :+)
end
puts sum(1, 2, 3, 4) #=> 10
# キーワード引数
def create_user(name:, age:, email: nil)
{ name: name, age: age, email: email }
end
user = create_user(name: "Alice", age: 25)
p user #=> {:name=>"Alice", :age=>25, :email=>nil}
よくあるユースケース
Endless method定義(Ruby 3.0+)
# 従来の記法
def double(x)
x * 2
end
# Endless method定義
def double(x) = x * 2
def greet(name) = "Hello, #{name}!"
def adult?(age) = age >= 20
# 使用例
puts double(5) #=> 10
puts greet("Bob") #=> Hello, Bob!
puts adult?(25) #=> true
様々な引数パターン
# 位置引数 + キーワード引数 + ブロック
def process(data, *args, format: :json, **options, &block)
puts "Data: #{data}"
puts "Args: #{args}"
puts "Format: #{format}"
puts "Options: #{options}"
block.call if block
end
process("test", 1, 2, format: :xml, debug: true) do
puts "Processing..."
end
# 破壊的メソッド(!)と問い合わせメソッド(?)
def upcase!(str)
str.upcase! # 元のオブジェクトを変更
end
def empty?(collection)
collection.empty? # 真偽値を返す
end
注意点とベストプラクティス
- メソッド名は小文字のスネークケース
- 破壊的メソッドには!をつける慣習
- 真偽値を返すメソッドには?をつける慣習
- Ruby 3.0以降(3.4で強化)、キーワード引数と位置引数の自動変換が廃止された
- メソッドは20行以内に収めるのが理想
まとめ
メソッド定義について学びました。実践的なコード例を通じて、Ruby 3.4の機能を活用できるようになりましょう。
Discussion