我从xml blob中提取信息并将其分配给OpenStruct。我想将字段分配给openstruct,其名称与xml字段相同。
现在我正在使用eval:
<input type="text" class="form-control" name="description" placeholder="Enter description"
[(ngModel)]="description" style="height:200px" >
有关如何在不使用 vehicles = []
xml['vehicles'].each do |vv|
infos = OpenStruct.new
['model','vehicleIdentifier','make','modelYear'].each do |iid|
eval("infos.#{iid} = vv['#{iid}']")
end
vehicles << infos
end
的情况下执行此操作的任何建议?
谢谢!
答案 0 :(得分:1)
如何取出eval
并使用[]
分配语法呢?
vehicles = []
xml['vehicles'].each do |vv|
infos = OpenStruct.new
['model','vehicleIdentifier','make','modelYear'].each do |iid|
infos[iid] = vv[iid]
end
vehicles << infos
end
vehicles.first.model # => vehicle model
您仍然可以在方法表单中的infos
上访问此信息,如上所示。如docs
答案 1 :(得分:0)
这里绝对没有理由使用eval
。您需要的一切都已经可用。标准表格很简单:
infos[iid] = v[iid]
这是因为iid
只是一个字符串。像eval("v['#{iid}'])
这样的事情会让事情发生变得更加复杂。
您还可以通过识别键列表永远不会更改来优化此代码,以便可以使其成为常量,并且可以基于简单映射来组合OpenStruct对象:
XML_KEYS = %w[ model vehicleIdentifier make modelYear ]
稍后您的方法:
OpenStruct.new(
XML_KEYS.map do |iid|
[ iid, vv[iid] ]
end.to_h
)
您也可以在更广泛的层面上应用map
技术:
vehicles = xml['vehicles'].map do |vv|
OpenStruct.new(
XML_KEYS.map do |iid|
[ iid, vv[iid] ]
end.to_h
)
end
在哪里可以支持创建变量的需要,然后用<<
强制填充它。
有效使用Ruby的关键是确定何时可以使用Enumberable类型工具执行一系列简单转换,而不是通过其设计按照其他语言规定的方式执行。