Rubyで自作したメソッドに複数のデータを渡すなら、オプション引数を使ってみてはいかがでしょうか。Rubyでメソッドに引数を渡す方法は、決まった順に変数を記述するだけではありません。キーワードと値のペアで引数を渡すこともできます。そして、オプション引数を使えば、キーワードと値のペアを幾つも指定することが可能です。
今回はオプション引数を使ってRubyのメソッドに引数を渡す方法を解説します。
メソッドの引数を記述するには
Rubyには他のプログラミング言語にはない、便利な機能が幾つもあります。その1つがメソッドの引数です。他のプログラミング言語のように順番で引数を指定する方法も使えますが、Rubyではキーワードと変数のペアによる引数を渡せます。
今回紹介するオプション引数はそのようなキーワードと変数のペアで引数を渡す機能ですが、オプション引数について解説する前にRubyにおけるメソッドの引数の基本について解説します。
メソッドの基本
Rubyのメソッドとは他のプログラミング言語における関数のあたるもので、複数の処理を1つにまとめて扱いやすくしたものです。そして、その処理で使われる数字や文字列を受け渡すために引数が使われます。
引数はメソッドを実行する際に、メソッドの名称に続いて括弧の中に記述します。また、複数の引数を受け渡すことも可能です。なお、複数の引数を指定する場合はコンマで区切ってください。
メソッドの書式
メソッド名( 引数1, 引数2, … )
引数の基本は順番通りに指定する
メソッドの通常の引数は、通常それを定義された順番で指定されなければなりません。例えば、引数1、引数2の2つの引数が定義されたメソッドがあった場合、それを呼び出す際、メソッド名に続く()内に引数1、引数2の順序で指定します。
例えば、次のような2つの引数を使用するメソッドがあった場合、通常の引数は次のように使用します。
通常の引数でメソッドを呼び出す例
def print_two(msg1, msg2) print(msg1 + ", " + msg2 + "\n") end print_two("Hello", "Ruby") # Hello, Rubyが表示される
この例は2つの引数を使うメソッドの定義と実行の例で、実行時に1番目の引数に”Hello”を、2番目の引数に”Ruby”を指定することで、それぞれ「msg1」「msg2」に受け渡され、メソッド内の処理で使われます。
キーワードと値のペアで引数を受け渡す
先ほどメソッドで引数を指定する方法を説明しましたが、Rubyでは順番に引数を指定する代わりに、キーワードと値のペアで引数を受け渡せます。それがキーワード引数とオプション引数です。
キーワード引数とはキーワードと値のペアで引数を指定する方法です。この方法は、メソッドを定義する際、キーワードと対応する変数を指定し、渡された引数を順番ではなくキーワードによって参照します。
またオプション引数は、まるで連想配列のようにキーワードと値の複数のペアを、1つの変数で受け取る方法で、メソッドの中ではRubyにおけるハッシュから値を取り出すのと同じ方法でキーワードから引数を取り出せます。
Rubyのオプション引数とは
先ほど簡単に紹介したようにRubyのオプション引数とは、Rubyにおけるハッシュのように自由にキーワードと値のペアで引数を記述し、それを引き渡せる機能です。そして引き渡した引数はメソッドの内部でハッシュのように扱えます。
次からオプション引数について解説します。
オプション引数の書き方
オプション引数を利用するにはメソッドを定義する際に引数を受ける変数名に「**」を付けます。そして、この方法で指定された引数は、「**」の付いた変数名のハッシュとしてメソッドの中で利用できます。
オプション引数の書き方
def メソッド名( **引数名 )
なおオプション引数で受け取ったキーと値は、次の例のようにeachメソッドを使って取り出すことが可能です。
オプション引数の例
def show_options( **options ) options.each do |key, value| puts "#{key}は#{value}です" end end show_options( msg1: 'keyword', msg2: 'options' )
上の例の実行結果は下記のとおりです。
msg1はkeywordです msg2はoptionです
自由に引数を指定できるのがメリット
オプション引数は、メソッドを実行する際にまるでハッシュのようにキーワードと値のペアで指定できるので、順番や数の制限が無く、自由に引数を指定できるのがメリットです。
そのため、例えばメソッドに新しい機能を追加してその分の引数を増やしたい場合でも、メソッドの中にオプション引数から取り出す処理を追加するだけで、その機能を使わない使い方に影響を与えずに機能拡張が可能です。
オプション引数と同じような引数
Rubyでは変数名を順に指定する引数の他に、今回紹介するオプション引数のように複数の引数を1つの変数で参照したり、ハッシュのようにキーワードと値のペアで指定することが可能です。
次から、配列で指定する可変長引数とキーワードと値のペアで指定するキーワード引数を紹介します。
オプション引数がハッシュなら可変長引数は配列
先ほど説明したようにメソッドを定義する際、引数に「**」を付けたのがオプション引数ですが、「*」を付けると可変長引数となり、引数を配列として受け取ることが可能です。可変長引数も引数の数に制限がありません。
ただし、配列のため引数として指定した順序で取り出し、メソッドの中で利用する必要があります。eachメソッドなどで順に取り出して、メソッドの中の処理で利用してください。
可変長引数の書き方
def メソッド名( *引数名 )
可変長引数の使用例
def show_arrays( *arrays ) arrays.each do |value| puts "引数は#{value}です" end end show_arrays( "keyword", "option" )
上の例の実行結果は下記のとおりです。
引数はkeywordです 引数はoptionです
ハッシュを個別に指定するキーワード引数
オプション引数と同じようにキーワードと値のペアを引数として使う方法がキーワード変数です。なおキーワード引数で定義されたメソッドを使うには、それを同じキーワードを指定しなければなりません。
なお、キーワード引数が定義されている場合、メソッド内の処理では変数名の代わりにキーワードが使われます。また定義に使用されたキーワードに対応する値は、そのキーワードのデフォルト値として使われます。
キーワード引数の書き方
def メソッド名( キーワード: 引数の初期値 )
キーワード変数の使用例
def show_keyword( msg: 'none' ) p msg end show_keyword( msg: "message" ) # "message"が表示される show_keyword() # "none"が表示される
この例では、キーワード変数としてハッシュのキーワードにあたる「msg」がメソッドの中で使われます。また、メソッドを呼び出す際に引数を指定しない場合は、定義に使われた「none」が表示されます。
キーワード引数とオプション引数を同時に使用する
先ほど紹介したキーワード変数は、同じハッシュ形式のオプション変数を同時に使用することが可能です。
キーワード変数とオプション変数を同時に使う例
def show_args argc: 0, **argv puts "argc = #{argc}" argv.each do |key, value| puts "#{key}は#{value}です" end end show_argc argc: 2 1st:"keyword", 2nd:"option"
上の例の実行結果は下記のとおりです。
argc = 2 1stはkeywordです 2ndはoptionです
まとめ
Rubyのメソッドは他のプログラミング言語の関数のように使えますが、その引数の指定方法として、他のプログラミング言語のように変数を順に指定する方法の他に、ハッシュや配列形式でも指定できます。
そして連想配列のことをRubyではハッシュと呼びますが、そのハッシュ形式の引数がオプション引数です。キーワードと値のペアで渡せて、指定できる引数の数に制限のないオプション引数を利用することで、自由度の高いメソッドを記述できます。ぜひ、活用してください。