2016-06-15 7 views
-2

Iサンプルコードの部分を有する:キーワード引数はどのように機能しますか?

def m(args = nil, **kwargv) 
    puts kwargv 
    a = args or {} 
    puts a 
    kwargv['a'] = a 
    puts kwargv 
end 

私が起動すると:

m(args = {'c':'d'}) 
m(args: {'c': 'd'}) 
m(args = {xxx}, {}) 

のみargsとして解釈さargsう最後に、第1および第2のものでは、辞書はkwargvとして使用される。

argsをdictとして指定するよりエレガントな方法はありますか?

+2

__Don't__は、条件のために 'または'(そしてその友人 'と'/'ない')を使用します。ここで空のハッシュのデフォルト値を指定できると思うかもしれませんが、そうではありません。 –

+0

dictとは何ですか? ................ – sawa

答えて

3

これは動作するはずです:

> m({'c' => 'd'}) 
# {} 
# {"c"=>"d"} 
# {"a"=>{"c"=>"d"}} 
# => nil 

この背後にあるロジックは、最初の引数はオプションであるため、記号キーでハッシュを渡し、(nilをデフォルト)、そして最後の引数は、キーワードと引数であるということです( m({ :c => 'd'}))はキーワードハッシュとして解釈されます。その他のタイプの引数は、最初のパラメータとして渡されます。 (argsパラメータを命名しながら、メソッドを呼び出して、サイドノートで

> m({ :c => 'd' }, {}) 
# {} 
# {:c=>"d"} 
# {"a"=>{:c=>"d"}} 

を:あなたは本当に最初パラメータとしてキーワードのハッシュを渡す必要がある場合は、明示的にもパラメータを渡す必要がありますm(args=something))は余計なもので、実際にあなたが思っているものとは何か違うことをします(argsという名前のローカル変数にsomethingを割り当て、それをメソッドに渡します)。代わりにm(something)を使用してください。

+0

最初の例では、 '{'c' => 'd'}'ハッシュはキーワード引数として渡されません**。代わりに、それは位置引数として渡され、 'args'で利用可能です。シンボルキーでハッシュを渡すときも同じです。ここでキーワード引数だけを渡したいのであれば、そのメソッドを 'm(** {:c => 'd'})'と呼ぶ必要があります。 –

+0

最初の部分について - それは私が答えで言うことです。私は2番目の部分であなたと同意しなければなりません - シンボルキーを持つハッシュを渡す(Ruby 2.0.0)がキーワード引数ハッシュとして渡されます... –

+0

Hmmm、私のテストがオフであったようです最初は奇妙です)。あなたはもちろん、シンボルキーがハッシュで、実際には 'kwargs'に渡されます。興味深いことに、混合記号と文字列をキーとしてハッシュを渡すと、文字列キーは 'args'に渡され、シンボルキーは' kwargs'に渡されます。私はこのことから離れていると思う:メソッドのインターフェイスを設計するときにできるだけこれらのあいまいさを避けるようにしてください。 –

関連する問題