Rubyのメソッドは、他のプログラミング言語の関数のように使えますが、同じではありません。関数と同じように引数を使えるものの、デフォルト値を設定して省略可能な引数が作れたり、引数を配列やハッシュで受け取ることも可能です。
今回はRubyのメソッドにおける引数の使い方について解説します。
メソッドの引数の詳細
Rubyのメソッドは、他のプログラミング言語の関数と同じように使うことが可能です。そして、関数のように引数でデータを受け渡せます。しかし、関数とメソッドは全く別の機能です。
例えばRubyの標準で使えるメソッドの中には引数を必要とするものを、必ずしも必要としないものがあります。そしてメソッドを自作する場合も同じようなメソッドを作れます。
ではそもそもメソッドの引数とは何でしょうか。まずはRubyにおけるメソッドの引数の基本について解説します。
そもそも引数とは
多くのプログラミング言語では、関数を定義することで、同じような処理を何度も書くことなく、読み易いプログラムを作れます。ただし特別に宣言した変数以外は、関数の中でそれを呼び出した処理の変数をそのまま使えません。そこで関数で使う変数を引数で引き渡します。
Rubyでは他のプログラミング言語における関数の代わりにメソッドを使います。そしてメソッドの中で使えるローカル変数と、それを呼び出したプログラムで使われていたローカル変数は別ものです。そのため、メソッドを呼び出す際に引数として変数の値を受け渡し、メソッドの中で利用するのは関数と同じです。
引数の無いメソッドとは
Rubyの使えるメソッドの中には、引数が不要なメソッドもたくさんあります。これは、標準ライブラリの多くのメソッドがオブジェクトを対象に処理する機能であり、引数で変数を受け渡さなくて、既に指定されているためのです。
ただし、オブジェクトを処理する際に追加で情報が必要な場合は、引数を設定します。なお中には引数のデフォルト値が設定されており、省略した場合そのデフォルト値を使うケースもあります。
そして自作したメソッドでもインスタンス変数を処理するだけなら引数は必ずしも必要ありません。また、デフォルト値を設定しておくことが可能です。
引数の型宣言は不要
Ruby以外のプログラミング言語の中には、受け渡す引数の型を定義し、それと一致しない場合にエラーとなるものもあります。Rubyはスクリプト言語で変数の型宣言が無いので、引数の型宣言もありません。
なおRubyでは、変数に何か値が代入されたら、その値に該当するクラスのオブジェクトが自動的に作られます。これは引数を受け渡した場合も同じです。そして、もしメソッド内の処理がそのオブジェトを対象にしていない場合、エラーが発生します。メソッドを自作する場合は、必要に応じてチェックする仕組みも組み込んでください。
引数付きのメソッドの作り方
自作のメソッドを作る場合、クラス内で参照できるインスタンス変数を操作するだけなら引数は不要です。しかし条件等を指定したい場合は引数を設定します。
次から引数付きのメソッドの作り方を解説します。
通常の引数の使い方
メソッドに単に値を引き渡すだけなら、メソッドを定義した際に、引数を受け取ってメソッド内で利用する変数名を記述します。なお複数の引数を利用する場合は、「,」で区切って設定してください。
引数を利用したメソッドの定義方法
def メソッド名( 引数1, 引数2, … )
メソッドの処理
ned
引数を使った例
@name = "名前:" def view_name( views ) puts @name + views end view_name("ポテパン") # "名前:ポテパン"が表示される
この例はメソッド内からも参照できるインスタンス変数「@name」と、引数で与えられたviewsを繋いで表示します。
デフォルトありの引数の使い方
先ほど紹介したようにRubyでは引数を省略するとデフォルト値が使われるメソッドも作成できます。このようなメソッドを作る場合は、メソッドを定義した際に引数にデフォルト値を設定しておきます。
なお、デフォルトありの引数となしの引数の混在は可能ですが、i番目の引数にデフォルト値を設定したら、i+1番目以降の全てにデフォルト値を設定しなければなりません。そのため、1番目の引数は必須ですが、2番目以降にデフォルト値を設定して省略が可能、といった使い方をします。
デフォルト値ありのメソッドの作り方
def メソッド名( 引数1=デフォルト値1, 引数2=デフォルト値2, … )
メソッドの処理
ned
デフォルト値ありの引数を使った例
@name = "名前:" def view_name( views="なし" ) puts @name + views end view_name("ポテパン") # "名前:ポテパン"が表示される view_name() # "名前;なし"が表示される
可変長引数を使う
一般的に関数で指定できる引数の数は、関数を宣言した際に決まってしまいますが、Rubyではサイズが可変な配列として引数を受け取ることが可能です。そしてこのような引数を配列で受ける方法を、可変長引数と言います。
使い方は複数の引数の変数を指定する代わりに、アスタリスク(*)がついた変数を1だけ指定することで、その変数を配列として扱えます。
可変長引数の使い方
def メソッド名( *引数 )
メソッドの処理
ned
可変長引数の使用例
@name = "名前" def view_names( *arr ) strs = @name arr.each do |x| strs = strs + ":" + x end puts strs end view_names("ポテパン","スタイル","ブログ") # "名前:ポテパン:スタイル:ブログ"が表示される
この例では可変長引数を使って引数を受け渡しているので、引数を格納した配列オブジェクトのoptを対象にeachメソッドを使って引数の値を取り出しています。
オプション引数を使う
先ほど引数を配列として受け取る可変長引数を紹介しましたが、同じように引数をハッシュとして受け取る方法がオプション引数です。オプション引数を使う場合は、引数を受け取る変数にアスタリスク(*)を2つ付けます。
オプション引数の使い方
def メソッド名( **引数 )
メソッドの処理
ned
オプション引数の例
@name = "名前" def view_name( **opt ) puts @name + ":" + opt[:s1] + ":" + opt[:s2] + ":" + opt[:s3] end view_name(s1:"ポテパン", s2:"スタイル", s3:"ブログ")
引数の作り方のコツ
Rubyはオブジェクト指向なオープンソースのスクリプト言語です。さらにプログラムで使われる変数の多くがオブジェクトであり、その操作はオブジェクトで使えるメソッドを利用します。
そのようなRubyですから、自作したメソッドでも引数で外部から与えるのではなく、できるだけインスタンス内のデータを使うメソッドにすると、Rubyらしいプログラムを作れます。
ただし自作のメソッドで引数を使うべきでない、ということではありません。条件の指定などで引数が必要なケースもあります。ぜひ、インスタンス変数と外部から与える引数をうまく活用しましょう。
まとめ
これまで紹介したようにRubyのメソッドは他のプログラミング言語の関数のように使えます。なおオブジェクトの中の機能に当たるメソッドは、同じオブジェクトのデータを処理するための仕組みです。それを理解してメソッドを作り、必要なら引数で外部からデータを受け渡しましょう。
なお、Rubyのメソッドの引数として、一般的な引数の使い方の他に、デフォルトの値を設定できたり、可変長引数やオプション引数も使えます。引数を利用するシーンに応じて、使い分けてください。