ruby - 使用eval从xml数据中分配对象变量的替代方法

时间:2017-11-27 16:55:04

标签: ruby

我从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 的情况下执行此操作的任何建议?

谢谢!

2 个答案:

答案 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类型工具执行一系列简单转换,而不是通过其设计按照其他语言规定的方式执行。