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

ruby—使用eval从xml数据分配对象变量的替代方法,ruby,Ruby,我从一个xml blob中提取信息并将其分配给一个xml blob。我想给openstruct分配与xml字段同名的字段 现在我正在使用eval,就像这样: vehicles = [] xml['vehicles'].each do |vv| infos = OpenStruct.new ['model','vehicleIdentifier','make','modelYear'].each do |iid| eval("infos.#{iid} = vv[

我从一个xml blob中提取信息并将其分配给一个xml blob。我想给openstruct分配与xml字段同名的字段

现在我正在使用eval,就像这样:

  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
关于如何在不使用eval的情况下执行此操作,有何建议

谢谢

去掉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上访问这些信息。如图所示,这里绝对没有理由使用eval。你需要的一切都已经准备好了。标准格式仅为:

infos[iid] = v[iid]
这是因为iid只是一个字符串。做一些像evalv[{iid}}]这样的事情会让事情变得更加复杂

您还可以通过认识到键列表永远不会更改来优化此代码,从而使其成为常量,并且可以基于简单的映射组合OpenStruct对象:

XML_KEYS = %w[ model vehicleIdentifier make modelYear ]
稍后在您的方法中:

OpenStruct.new(
  XML_KEYS.map do |iid|
    [ iid, vv[iid] ]
  end.to_h
)
您也可以在更广泛的层面上应用该映射技术:

vehicles = xml['vehicles'].map do |vv|
  OpenStruct.new(
    XML_KEYS.map do |iid|
      [ iid, vv[iid] ]
    end.to_h
  )
end

在哪里可以避免创建一个变量然后强制填充它的需要您可以添加一个XML的代表性部分吗?