2017-01-11 2 views
2

Rubyバージョン:2.3.1Ruby Structsをキーワード引数で初期化する

Ruby Structsをキーワードparamsで宣言することはできません。 Struct以内にこれを行う方法はありますか?

例:

MyStruct = Struct.new(:fname, :lname) 
=> MyStruct 

my_struct = MyStruct.new(fname: 'first', lname: 'last') 
=> <struct MyStruct fname={:fname=>"first", :lname=>"last"}, lname=nil> 

my_struct.fname 
=> {:fname=>"first", :lname=>"last"} 

my_struct.lname 
=> nil 

答えて

2
my_struct = MyStruct.new(fname: 'first', lname: 'last') 

my_struct = MyStruct.new({ fname: 'first', lname: 'last' }) 
    #=> #<struct MyStruct fname={:fname=>"first", :lname=>"last"}, lname=nil> 

(一つの引数)と同じであるので、fname引数に等しく設定され、lnameは同様に、nilに設定されていますそのx, y = [2]; x #=> 2; y #=> nil

これは、ハッシュがメソッドの引数である場合、Rubyが中カッコを省略できるためです。

this oneなどの関連する質問をSOで検索したい場合があります。

+0

これは意味があります。しかし、私はまだキーワードの引数をどのように働かせるかについてはまだ分かりません。 'MyStruct.new({fname: 'first'}、{lname: 'last'})'という2つのハッシュで渡すことができますが、これは文字列ではなくハッシュ値を渡します。 – user3162553

+0

3ヶ月前のコメントを見逃してしまったようです。 'my_struct = MyStruct.new({fname: 'first'}、{lname: 'last'}); my_struct.fname#=> {:fname => "first"}; my_struct.lname#=> {:lname => "last"} '。それはあなたの質問に答えますか? –

+1

私はStructから継承する 'NamedStruct'クラスを定義するgem(https://github.com/rohitpaulk/named_struct)を書き、代わりにキーワード引数を受け入れるように初期化動作を変更しました。 – rohitpaulk

関連する問題