IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

RubyビギナーのためのStep upコラム

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート 

第3回 Rubyのキーワード引数について (中越智哉) 2018年2月

みなさん、こんにちは。
前回はRubyの「多重代入」についての話題でしたが、今回も引き続きRubyの文法にフォーカスした話題「キーワード引数」です。

前回の多重代入もそうでしたが、キーワード引数も、プログラミング言語によって、あったりなかったりする概念ですから、他の言語を学んでいて、Rubyを勉強し始めた人の中には、そもそもその存在を知らない人もいるかもしれないですね。

ご存知の通り、メソッドには引数を定義することができます。
Rubyで以下のように定義されたメソッドprintDayには、year,month,day3つの引数を与えることができます。

def printDay(year,month,day)
    puts "#{year}年#{month}月#{day}日"
end

通常、メソッドに与える引数は定義された順に指定しますから、たとえば「2018年2月3日」と表示したければ、次のように呼び出します。

printDay(2018,2,3)

ファイルmethod1.rbに以下のように記述してみます。

def printDay(year,month,day)
    puts "#{year}年#{month}月#{day}日"
end

printDay(2018,2,3)

実行結果は以下のようになります。

fig01

日本の感覚では、日付の記述順は「年」「月」「日」という順序ですから、メソッドの引数がこの並びで定義されていることも、実行時の引数の順序をこの並びで指定することにも、違和感はないと思います。しかしながら、もしこのメソッドを米国の方が定義したとしたら、

def printDay(month,day,year)
    puts "#{year}年#{month}月#{day}日"
end

となるかもしれません(表示内容が日本語のままなのはアレですが笑)。このメソッドを日本の方が実行するときに、やはり「年」「月」「日」の順で指定してしまうと、当然、実行結果は想定と異なってしまいます。先ほどと同じ順番で引数を指定すると、当然ながら

fig02

のようになってしまいますね。これはちょっと極端な例かもしれませんが、実際の開発でも、引数が複数あるメソッドで仕様変更があって引数が増えたり、順番が変わったり、ということがありますよね。

そんなときに便利なのがキーワード引数です。キーワード引数は、その名の通り引数指定にキーワード(引数名)をつけることができ、引数の指定順序に関係なく、自分の思った引数に値を引き渡すことができます。

例えば、先ほどのprintDayメソッドの各引数に、以下のように記述するとキーワード引数として扱うことができるようになります。method2.rbというファイルに、以下のように記述してみます。

def printDay(month:12,day:31,year:2018)
    puts "#{year}年#{month}月#{day}日"
end

printDay(year:2018,month:2,day:3)

引数部分が「キーワード:デフォルト値」というハッシュ型の記述になっていることがおわかりでしょうか。こうすると、各引数にはそれぞれ「month」「day」「year」というキーワードがついたことになり、メソッド実行時には各引数にキーワードをつけることが求められます。

呼び出し側のコードは以下のようになっていますね。

printDay(year:2018,month:2,day:3)

キーワード引数では、呼び出し側の引数指定が「キーワード:渡したい値」のようになります。通常のメソッド呼び出しの引数に「キーワード:」の部分が追加された記述になります。メソッド定義部の引数の定義順と、呼び出し側の引数の指定順は異なっていますが、キーワードがついていることにより、順序に関わらず想定通りの引数に値を受け渡すことができています。

実行結果も、もちろん想定通り

fig03

とすることができました。
ちなみに、メソッドをキーワード引数の形式で定義した場合は、呼び出し時の指定にはキーワードが必須となりますので注意してください。

printDay(2018,2,3)

のような呼び出しは、エラーとなってしまいます。
method2.rbというファイルの5行目を上記のように書き換えて実行すると、エラーとなります。

fig04

また、定義時にデフォルト値を指定したキーワード引数は、呼び出し時には指定を省略することができますので、先ほどのmethod2.rbの5行目を

printDay

のように書き換えて引数をすべて省略すると、デフォルト値(yearが2018、monthが12、dayが31)が適用され、以下のような表示結果となります。

fig05

また、メソッド定義時のキーワード引数においてデフォルト値を省略する記述(「キーワード名:」のように値を記述しない)も可能ですが、この場合は当然引数の省略はできません。

method3.rbというファイルに、以下のように記述して実行すると、6行目の引数なしのprintDayメソッド呼び出し時にエラーとなります。

def printDay(month:,day:,year:)
    puts "#{year}年#{month}月#{day}日"
end

printDay(year:2018,month:2,day:3) printDay

実行結果は以下のようになります。

fig06

いかがでしたでしょうか。メソッドにおける引数の順序は、定義に従って指定すればよいとはいうものの、仕様変更であったり、思い込みであったりで指定順序が思い通りになっていなかったりしても、Rubyのように動的型の言語では特に気づきにくかったりするものです。キーワード引数を上手に使いこなして、バグの少ないプログラムが作れるようになっていくとよいですね。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  OpenStack  システムトラブルシュート