こんにちは! フリーエンジニアの長瀬です。
Rubyを使ったプログラミングをしていて、「引数の種類が多すぎて分からない!」、「そもそもどんな引数があるのか分からないので知りたい!」そんなことを思った経験はないでしょうか?
今回はそんなRubyの引数に関する疑問に答えていきます。
この記事では、rubyの引数について
・ 普通の引数
・ 括弧なしの引数
・ デフォルト引数
・ キーワード引数
・ 可変長引数
・ オプション引数
・ コマンドライン引数
・ ブロック引数
という基本的な内容から、
・ コマンドラインにオプションを作成する
・ -h、–-helpオプションを使って、定義されているオプションを確認する
・ コマンドラインのオプションに引数を渡す
といった応用的な内容についても解説していきます。
Rubyにおける引数
普通の引数
一番よく使用される引数です。何個でも付けることができますが、引数の数が多過ぎるとソースコードが読みにくくなるため、書き方については考える必要があります。
ハッシュや配列を引数として渡すときも、変換の必要はありません。
以下、サンプルコードです。
class Hoge def self.foo(msg) p msg end end Hoge.foo('hoge')
[実行結果]
"hoge"
括弧なしの引数
普通の引数から括弧を取り除いた形です。p, putsなどによる出力、アクセサ指定、returnなどの時は括弧を省略することが推奨され、自分で作成したメソッドの場合は括弧を省略せずに書くことが推奨されています。
また、Railsではviewのメソッド(link_to, form_forなど)で括弧を省略するのが推奨されています。
以下のサンプルコードのように、メソッド呼び出し時に括弧を省略することができます。
class Hoge def self.foo(msg) p msg end end Hoge.foo 'hoge'
[実行結果]
"hoge"
デフォルト引数
デフォルト引数を使うと、引数が無かった場合、あらかじめ設定された値を入れることができます。デフォルト引数は、引数が空になると困る時に設定します。
また、デフォルト引数を複数持つ場合はハッシュを引数として渡すのがよいでしょう。
以下、サンプルコードです。
class Hoge def self.piyo(msg='fuga') p msg end end Hoge.piyo Hoge.piyo('fugafuga')
[実行結果]
"fuga" "fugafuga"
引数なしでHoge.piyoメソッドを呼び出したとき、デフォルト引数の「fuga」が出力されています。
キーワード引数
キーワード引数を使うと、引数をハッシュで渡すことができます。ハッシュなので、順番を気にせず渡すことができるというメリットがあります。1つだけ渡すよりは複数渡すときに、よりメリットを感じやすいでしょう。
class Hoge def self.piyo(msg: 'hello', name: 'Yamada') p "#{msg}, #{name}" end end Hoge.piyo Hoge.piyo(msg: 'Hi', name: 'Sato') Hoge.piyo( name: 'Sato', msg: 'Hi')
[実行結果]
"hello, Yamada" "Hi, Sato" "Hi, Sato"
msgとnameの順番を入れ替えても問題なく実行することができています。
可変長引数
可変長引数は、引数が何個渡るか不明な場合に指定します。渡した引数は配列で格納されます。
以下、サンプルコードです。
class Hoge def self.piyo(*msg) p msg end end Hoge.piyo('fuga') Hoge.piyo('huga','hugahuga') Hoge.piyo('a','b','c','d','e') ["fuga"] ["huga", "hugahuga"] ["a", "b", "c", "d", "e"]
「*」を付けることで引数を複数個設定することができます。
[実行結果]
["fuga"] ["huga", "hugahuga"] ["a", "b", "c", "d", "e"]
オプション引数
オプション引数は引数の数、名前に関係なくハッシュで引数を渡すことができる仕組みです。渡す引数の数が分からない時に便利です。
「*」を2つ付けるとオプション引数になります。オプション引数はハッシュとして受け取られます。
class Hoge def self.piyo(**msg) p msg end end Hoge.piyo(msg: 'fuga') Hoge.piyo(msg: 'huga', name: 'hugahuga')
[実行結果]
{:msg=>"fuga"} {:msg=>"huga", :name=>"hugahuga"}
コマンドライン引数
コマンドライン引数は、ターミナルから実行時に引数を読み込むことができる仕組みです。
プログラム内のコマンドライン引数は以下の変数に代入されます。
$0:コマンド名
ARGV[引数番号]:コマンドに渡した引数名
以下のサンプルコードは、実行したプログラムのファイル名とコマンドライン引数を出力するものです。
puts "$0:#{$0}" ARGV.each_with_index do |arg, i| puts "ARGV[#{i}]:#{arg}" end
実行例
$ ruby sample1.rb hoge foo
[実行結果]
$0: Sample1.rb ARGV[0]:hoge ARGV[1]:foo
ブロック引数
ブロック引数を使うと、ブロックを引数で渡すことができます。yieldと同じ意味で、どちらかというとyieldの方がよく使用されます。
class Hoge def self.piyo(&block) block.call end end Hoge.piyo{ p 'fuga' }
[実行結果]
"fuga"
また、yieldを使って書き直すと
class Hoge def self.piyo yield end end Hoge.piyo{ p 'fuga' }
[実行結果]
"fuga"
このようにyieldを使って書き換えても同じ結果になります。
詳しくはこちらのyieldの記事を一読することをおすすめします。
コマンドラインでオプションを設定する(optparse)
コマンドラインにオプションを作成する
optparseというライブラリーを使えば、簡単にコマンドライン引数にオプションを設定することできます。
実際に自分で作ってみます。
今回は-oと-bというオプションを設定してみます。(オプションは自由に作成できます)
sample.rbという名前で任意のディレクトリに保存します。
[sample.rbの内容]
require 'optparse' op = OptionParser.new op.on('-は','--hello','puts hello'){puts 'Hello, world'} op.on('-ぐ','--goodbye','puts goodbye '){puts 'Goodbye'} op.parse(ARGV)
このように、optparseをまず始めにrequireします。
そしてOptionParser.newでoptparseのインスタンスを作成してから、onというインタンスメソッドでオプションを設定します。
onの引数にはハイフン+(一文字)で省略形を設定できて、ハイフン+(複数文字)で省略形でないオプション名をつけることができます。
オプション名は複数つけることができて、順番は問いません。
また、最後の引数にはそのオプションの説明を設定してください。(今回はputs helloが説明の部分です)
ただ、-hや–helpはoptparseが読み込んだ時点でデフォルトで設定されているコマンドなのでこの名前のオプション名はつけないようにしましょう。
では、sample.rbをオプション付きで実行してみましょう。
ターミナルや、コマンドプロンプトを開いて次のsample.rbを指定してオプションを渡します。
ruby sample.rb -は
[実行結果]
Hello, world"
ruby sample.rb -は --goodbye
[実行結果]
Hello, world Goodbye
このように、複数のオプションも同時に指定することができます。
-h、–helpオプションを使って、定義されているオプションを確認する
このデフォルトで設定されている-h、–helpオプションを使えば、現在どんなオプションが設定されているのか確認できます。
試しに確認してみましょう。
ターミナルや、コマンドプロンプトを開いて次のsample.rbを指定して-hを指定してみましょう。
ruby sample.rb --help
[実行結果]
-は, --hello puts hello -ぐ, --goodbye puts goodbye
このように、定義されているオプションとその説明を確認できました。
コマンドラインのオプションに引数を渡す
オプションに引数を設定することも簡単にできます。
さきほどのコードを少し修正します。
require 'optparse' op = OptionParser.new op.on('-は','--hello ARG','puts hello'){|a| puts "引数は#{a}です"} op.on('-ぐ','--goodbye ARG','puts goodbye '){|a| puts "Goodbye,#{a}"} op.parse(ARGV)
このように、ARGなどの任意の文字をオプションの後ろに設定すると、引数を受け取れる状態になります。
ターミナルや、コマンドプロンプトを開いて次のsample.rbにオプションとともに引数を指定してみましょう。
ruby sample.rb -は 100 ruby sample.rb -ぐ Nagase
[実行結果]
引数は100です Goodbye,Nagase
このように、オプションに引数に渡せることを確認できました。
まとめ
いかがでしたでしょうか?
今回は、たくさん種類があるRubyの引数についてまとめました。
多種多様な引数がありますが、それぞれの特徴や用途をしっかりと理解しておけば怖がる必要はありません。
引数はメソッドの基礎でもありますから、きちんと理解を深めましょう。
また、コマンドラインにオブションを設定できるoptparseは便利ですね。
知っていると応用の幅が広がります。
もし引数について忘れてしまったらこの記事を確認してくださいね!