2017-01-11 2 views
2

Ruby version: 2.3.1Инициализация Ruby Structs с аргументами ключевого слова

Не похоже, что Ruby Structs можно объявить с помощью параметров ключевого слова. Есть ли способ сделать это в пределах 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 позволяет опустить фигурные скобки, когда хэш является аргументом метода.

Возможно, вы захотите найти SO по смежным вопросам, таким как this one.

+0

Хорошо, это имеет смысл. Тем не менее, я все еще не уверен, как заставить аргументы ключевого слова работать. Я могу передать два хэша, то есть 'MyStruct.new ({fname: 'first'}, {lname: 'last'}), но это даст мне хеш для работы вместо строки. – user3162553

+0

Я, кажется, пропустил ваш трехмесячный комментарий. 'my_struct = MyStruct.new ({fname: 'first'}, {lname: 'last'}); my_struct.fname # => {: fname => "first"}; my_struct.lname # => {: lname => "last"} '. Отвечает ли это на ваш вопрос? –

+1

Я написал драгоценный камень (https://github.com/rohitpaulk/named_struct), который определяет класс «NamedStruct», который наследует от Struct, и изменяет поведение инициализации вместо аргументов ключевого слова. – rohitpaulk