2014-01-06 追記
@yancya さんよりコメントにて、Ruby 2.1.0 以降では以下のように定義できると教えていただきました。
kwarg4.rb
def foo(bar:)
end
以下はオリジナルの投稿をそのまま残しておきます。
Ruby 2.1.0 にはまだ手をだしていません。
例えばこんなコードがあります。
kwarg1.rb
class Foo
def foo(bar: 'BAR')
p bar
end
end
Foo.new.foo
foo
メソッドを、キーワード引数 bar
を省略した状態で実行しています。
実行結果は以下のようになります。
$ ruby kwarg1.rb
"BAR"
デフォルト値である 'BAR'
が出力されます。
デフォルト値が nil
なら同様にそれが出力されることになります。
これを、省略不可にしたい場合ってどうすればいいんでしょう。
今のところ以下のようにしています。
kwarg2.rb
class Foo
def foo(bar: _)
p bar
end
end
Foo.new.foo
デフォルト値にアンダースコアを指定しています。
これを実行した結果は以下の通り。
$ ruby kwarg2.rb
kwarg2.rb:2:in `foo': undefined local variable or method `_' for #<Foo:0x007fcd69b859f0> (NameError)
from kwarg2.rb:7:in `<main>'
_
をローカル変数、またはメソッドとして探索した結果見つからず、NameError
になっています。
省略時にエラーになる、という意味では一応の目的を果たせました。
ですが、これはもちろん _
メソッドが定義されていた場合はエラーになりません。
kwarg3.rb
class Foo
def foo(bar: _)
p bar
end
def _
end
end
Foo.new.foo
実行結果は以下の通り。
$ ruby kwarg3.rb
nil
エラーは起こらず、_
メソッドの返り値がそのまま出力されてしまいます。
言語として用意されている方法ってないんでしょうか。