2016-08-25 9 views
0

はのキーワード引数でfooを呼び出すが、まだデフォルトが何であれ呼び出すための方法はあります私は、デフォルトのキーワード引数Rubyでデフォルトのキーワード引数を明示的に呼び出す方法はありますか?

def foo(bar: "baz") 
    bar 
end 

と機能を持っているとしましょうか?たとえば、これを動作させる方法は?

foo(bar: :default) 
#=> "baz" 

また、メソッド内のデフォルトの引数がそのメソッド内のものであるかどうかを確認する方法はありますか?

答えて

2

あなたが考えるよりも簡単です。

foo 
# => "baz" 

デフォルトは、明示的に指定されていない値にのみ適用されます。注意点としては、これは、この場合、あなたはそれをオーバーライドしていることを意味します

foo(bar: nil) 
# => nil 

私は、一般的に、このフォームのメソッドを作成しようとする理由は次のとおりです。

def foo(bar: nil) 
    bar or 'baz' 
end 

あなたがいないことを保証することができますその方法あなたが得るものが価値を返すかどうか。

+0

はい、ただし、デフォルトの値を明示的に呼び出す方法や、引数が渡されたときにデフォルト値が表示されるかどうかを確認する方法がありますか? デフォルトをnilに設定してから、またはステートメントでオーバーライドすることは、可能でない場合には最適な方法かもしれないようです。答えてくれてありがとう! –

+1

これはRubyのコア標準の一部ではありませんが、絶対に知っておく必要がある場合は、実行する方法があります。私は強くその種のハックを使用しないことをお勧めします(http://stackoverflow.com/questions/622324/getting-argument-names-in-ruby-reflection)。多くの場合、 '= nil'や' x:nil'という表記は、あなたのライブラリを使っている人には「オプション」を意味し、デフォルトが適用されることを期待しています。このデフォルトは手動で文書化することができます。また、期待される結果が得られれば、発信者に関係しないので関連性がないかもしれません。 * Do What I Mean *の原則がここに当てはまります。 – tadman

+0

ありがとう、私はそれを念頭に置いておきます。私はRubyでメタプログラミングを行う場合、妥当性の限界をテストしています。私は誰もこのメソッドに触れる必要がないことを望んでいます:) –

-2

あなたはこのように行うことができます。すでに

def foo(bar = "baz") 
    args = method(__method__).parameters // This will give current methods argument info. 
    bar 
end 
+1

残念ながら、これはデフォルト値ではなくキーワード引数名​​のみを提供します。 –

+0

このメソッドは面白いですが、デフォルトではなく必要なパラメータについてのみ記述しています。私はそれが可能だと思ったが、そうではなかった。 – tadman

1

tadmanあなたはRubyの組み込みのリフレクションAPIを介してメソッドのデフォルト引数を取得することはできませんexplained

ただし、単純に、独自のメソッドにデフォルト値を抽出することができます。

def default 
    'baz' 
end 

def foo(bar: default) 
    p bar: bar, default: default 
end 

foo 
# {:bar=>"baz", :default=>"baz"} 

foo(bar: nil) 
# {:bar=>nil, :default=>"baz"} 

また、あなたはdefaultはプライベート作ることができます。

関連する問題