💎

【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