使用关键字参数初始化Ruby Structs

时间:2017-01-11 23:11:14

标签: ruby struct

Ruby版本:2.3.1

似乎不能使用关键字参数声明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 个答案:

答案 0 :(得分:6)

使用Ruby 2.5,您可以将keyword_init选项设置为true

MyStruct = Struct.new(:fname, :lname, keyword_init: true)
# => MyStruct(keyword_init: true)
irb(main):002:0> my_struct = MyStruct.new(fname: 'first', lname: 'last')
# => #<struct MyStruct fname="first", lname="last">

答案 1 :(得分:3)

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