Rubyのキーワード引数

プログラミング

プログラムはできるだけシンプルに分かりやすく記述することで、バグや認識違いを少なくすることができます。

Rubyのキーワード引数は、引数の意味を分かりやすく記述することができる手法の1つです。

本記事では、Rubyのキーワード引数について解説します。

記事内に記載しているプログラムは、Ruby2.7.1を使って動作確認をしています。

Rubyのキーワード引数

Rubyのキーワード引数について、以下の内容を解説します。

  • キーワード引数とは
  • キーワード引数の基本形
  • デフォルト値の指定
  • 順序の入れ替え
  • バージョンごとの変更点

キーワード引数とは

キーワード引数とは、引数にキーワードを付けて、順序に関係なく対応する引数を決定する記述方法です。

メリットとしては、以下の2点があげられます。

  • 引数にキーワードを付けることで、何を意味するものか分かりやすくなる
  • 引数に指定する順序を考慮する必要がなくなる

Rubyのキーワード引数は、2.0から導入された機能ですが、ハッシュとキーワード引数の扱いが分かりにくいということもあり、3.0に向けて改善が進んでいます。
そのため、バージョンごとに挙動が変わる可能性があるため、注意が必要となります。

キーワード引数の基本形

キーワード引数と従来の方法の違いを比較するために、まずは従来の方法で記述したプログラムが以下となります。

def greet(first_name, last_name, age)
    puts "#{first_name} #{last_name}、#{age}歳です。" # -> 山田 太郎、20歳です。
end
greet("山田", "太郎", 20)

上記のプログラムでは、3つの仮引数を受け取るメソッドを定義して、呼出し時に3つの実引数を指定しています。

キーワード引数を使ったプログラムが以下となります。

def greet(first_name:, last_name:, age:)
    puts "#{first_name} #{last_name}、#{age}歳です。" # -> 山田 太郎、20歳です。
end
greet(first_name: "山田", last_name: "太郎", age: "20")

従来の方法と結果に違いはなく、3つの仮引数と実引数の受け渡しをしています。
キーワード引数は、「キーワード: 値」の形式で指定します。
仮引数と実引数の値がキーワードによって紐付いています。

デフォルト値の指定

従来の方法でも可能ではありますが、キーワード引数においても仮引数に対してデフォルト値を設定することができます。

def greet(first_name:, last_name:, age: 30)
    puts "#{first_name} #{last_name}、#{age}歳です。"
end

上記のプログラムでは、ageに対してデフォルト値を指定しています。
メソッド呼び出し時に引数を指定しない場合は、デフォルト値が使われます。

greet(first_name: "山田", last_name: "太郎")
 # -> 山田 太郎、30歳です。

メソッド呼び出し時に引数を指定した場合は、その値が使われます。

greet(first_name: "山田", last_name: "太郎", age: "20")
 # -> 山田 太郎、20歳です。

デフォルト値が指定されていない仮引数を省略するとエラーが発生します。
この動作を用いることで、キーワード引数を必須化することができます。

greet(first_name: "山田", age: "20")
 # -> `greet': missing keyword: :last_name (ArgumentError)

順序の入れ替え

キーワード引数を指定すると、仮引数と実引数の順番が入れ替わっても、キーワードに紐づく値で処理を行います。

def greet(first_name:, last_name:, age: 30)
    puts "#{first_name} #{last_name}、#{age}歳です。"
end

first_nameを引数の最後に指定しても結果は同じとなります。

greet(last_name: "太郎", age: "20", first_name: "山田")
 # -> 山田 太郎、20歳です。

デフォルト値を使う場合は、省略することも可能です。

greet(last_name: "太郎", first_name: "山田")
 # -> 山田 太郎、30歳です。

バージョンごとの変更点

キーワード引数は、Ruby2.0で導入された機能です。
Ruby2.1ではキーワード引数によって受け取る値を必須化できるようになりました。

キーワード引数が導入される前は、ハッシュを使って擬似的にキーワード引数を実現していました。
そこにキーワード引数を導入したことで、ハッシュとキーワード引数が混合された場合の動作が分かりづらくなりました。

そこで、Ruby2.7からは、キーワード引数と普通の引数の間で行っていた自動変換が非推奨となり、実行時に警告が出るようになりました。
ハッシュをキーワード引数として扱う場合には、double splat演算子(**)が必要となります。

def greet(first_name:, last_name:, age: 30)
    puts "#{first_name} #{last_name}、#{age}歳です。"
end
greet(**{last_name: "太郎", first_name: "山田"}, age: "20")

自動変換に対する警告については、いくつか種類がありますので、詳細はRuby2.7のリリースノートを参照いただければと思います。

Ruby3.0では自動変換が除去される予定になっています。
(警告がでないように対応しておけば、Ruby3.0になっても問題なく動作するとのことです。)

警告が出てしまっているソースコードについては、早めに対応する必要がありますが、これから新しく作るソースコードには、なるべくキーワード引数とハッシュを混合しないようなプログラムとなるようにすることをオススメします。

まとめ

Rubyのキーワード引数についてまとめると、以下となります。

  • キーワード引数とは、引数にキーワードを付けて、順序に関係なく対応する引数を決定する記述方法である。
  • キーワード引数を使うことで、何を意味するものか分かりやすく、引数に指定する順序を考慮する必要がなくなるメリットがある。
  • キーワード引数とハッシュが混合した引数を用いる際には、バージョンによって挙動が変わる可能性があり、注意が必要。

キーワード引数を使うどうかは、プロジェクトやモジュールによって判断は様々ですが、プログラムを分かりやすくするための手法として用いてみてはいかがでしょうか。

 

今回はRubyのキーワード引数について解説しました。

以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました