如何生成常量来访问Ruby数组元素?
我使用数组来存储字段值。为了方便地添加和访问元素,我使用常量作为元素标识符 直到现在,我都是这样手工做的:如何生成常量来访问Ruby数组元素?,ruby,arrays,constants,eval,Ruby,Arrays,Constants,Eval,我使用数组来存储字段值。为了方便地添加和访问元素,我使用常量作为元素标识符 直到现在,我都是这样手工做的: stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"] values = ["it","can","be","anything",0,5.3,nil,88] LIDNUMMER,AARDF,PREST,DT_PREST,AANTAL,BEDRAG,VERSTR
stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"]
values = ["it","can","be","anything",0,5.3,nil,88]
LIDNUMMER,AARDF,PREST,DT_PREST,AANTAL,BEDRAG,VERSTREKKER,FOUTCODE = 0,1,2,3,1,5,6,7
p values[AARDF] => "can"
现在,我已经实现了如下自动化:
stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"]
values = ["it","can","be","anything",0,5.3,nil,88]
stages.each do |c|
eval "#{c.upcase} = #{stages.index(c)}"
end
p values[AARDF] => "can"
但是我想有一种更好的Ruby方法可以做到这一点,也许没有eval,有什么建议吗?是的,使用
散列和符号
stages = {:aardf => "aardf", :prest => "prest", ...}
stages[:aardf]
对于遗留,使用
AARDF = :aardf
及
仍然有效。是,使用散列和符号
stages = {:aardf => "aardf", :prest => "prest", ...}
stages[:aardf]
对于遗留,使用
AARDF = :aardf
及
仍然有效。另一方面,您可能会感兴趣-
stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"]
values = [0,1,2,3,4,5,6,7]
stages = stages.zip(values).inject({}) {|h, (k,v)| h[k.upcase]=v;h}
=> {"LIDNUMMER"=>0, "FOUTCODE"=>7, "BEDRAG"=>5, "VERSTREKKER"=>6, "AANTAL"=>4, "PREST"=>2, "AARDF"=>1, "DT_PREST"=>3}
p stages['AARDF'] #=> 1
另一方面,你可能会感兴趣-
stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"]
values = [0,1,2,3,4,5,6,7]
stages = stages.zip(values).inject({}) {|h, (k,v)| h[k.upcase]=v;h}
=> {"LIDNUMMER"=>0, "FOUTCODE"=>7, "BEDRAG"=>5, "VERSTREKKER"=>6, "AANTAL"=>4, "PREST"=>2, "AARDF"=>1, "DT_PREST"=>3}
p stages['AARDF'] #=> 1
如果您坚持按照您描述的方式进行操作,并且不使用哈希,那么这是我能想到的最简单的方法:
stages.zip(values) { |stage, value| Object.const_set(stage.upcase, value) }
values[BEDRAG] #=> 5
就个人而言,我只是构建了一个散列,但您比我更了解您的需求:
Hash[stages.map(&:upcase).zip(values)]
#=> {"LIDNUMMER"=>0, "AARDF"=>1, "PREST"=>2, "DT_PREST"=>3, "AANTAL"=>4, "BEDRAG"=>5, "VERSTREKKER"=>6, "FOUTCODE"=>7}
如果您坚持按照您描述的方式进行操作,并且不使用哈希,那么这是我能想到的最简单的方法:
stages.zip(values) { |stage, value| Object.const_set(stage.upcase, value) }
values[BEDRAG] #=> 5
就个人而言,我只是构建了一个散列,但您比我更了解您的需求:
Hash[stages.map(&:upcase).zip(values)]
#=> {"LIDNUMMER"=>0, "AARDF"=>1, "PREST"=>2, "DT_PREST"=>3, "AANTAL"=>4, "BEDRAG"=>5, "VERSTREKKER"=>6, "FOUTCODE"=>7}
谢谢大家,我学到了很多。
Michael的答案最接近,但并不正确(值数组可以包含任何内容,通常不是元素的顺序)。
我设法将这里介绍的不同技术结合起来,并得出以下结论
stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"]
values = ["it","can","be","anything",0,5.3,nil,88]
stages.each_with_index{|c,i|Object::const_set(c.upcase, i)}
p values[AARDF] => "it"
p values[BEDRAG] => 5.3
如果我使用散列,它对错误更敏感,我将停止使用散列
p values[hash["AARDF"]]
这不太顺利谢谢大家,我学到了很多。
Michael的答案最接近,但并不正确(值数组可以包含任何内容,通常不是元素的顺序)。
我设法将这里介绍的不同技术结合起来,并得出以下结论
stages = ["lidnummer","aardf","prest","dt_prest","aantal","bedrag","verstrekker","foutcode"]
values = ["it","can","be","anything",0,5.3,nil,88]
stages.each_with_index{|c,i|Object::const_set(c.upcase, i)}
p values[AARDF] => "it"
p values[BEDRAG] => 5.3
如果我使用散列,它对错误更敏感,我将停止使用散列
p values[hash["AARDF"]]
这不是很顺利stages={:aardf=>“aardf”,:prest=>“prest”}
p stages[:aardf]
但有时数组更好。在这种情况下,我需要确保没有添加任何元素,并且元素始终具有相同的顺序。我编辑了我的问题,以便更好地解释我需要什么,你会看到这里的散列不能像平滑的stages={:aardf=>1,:prest=>2}values=[0,1,2,3,4,5,6,7]p值[stages[:aardf]]那样工作,然后使用ruby 1.9和hash
,元素在那里排序。我已经准备好对其他类似的情况使用散列了
stages={:aardf=>“aardf”,:prest=>“prest”}
p stages[:aardf]
但是有时候数组更好。在这种情况下,我需要确保没有添加任何元素,并且元素总是具有相同的顺序。我编辑了我的问题,以便更好地解释我需要什么,您会看到这里的哈希不能像平滑的stages={:aardf=>1,:prest=>2}值=[0,1,2,3,4,5,6,7]p值[stages[:aardf]]然后使用ruby 1.9和Hash
,元素在那里排序。谢谢,但这还不够,实际上有两个数组,一个带有字段名,一个带有值,我将编辑我的问题以显示更好的示例:Hash[stages.map(&:upcase).zip(values)]
用于更新的问题或Hash[stages.map(&:upcase).zip(stages)
用于原始问题。谢谢,但这还不够,实际上有两个数组,一个带有字段名,一个带有值,我将编辑我的问题以显示更好的示例:Hash[stages.map(&:upcase).zip(values)
用于更新的问题或Hash[stages.map(&:upcase).zip(stages)
对于原始问题。ruby中的幻数是Symbol
s,因此请尝试使用它们。编辑值数组以使我需要的更清楚ruby中的幻数是Symbol
s,因此请尝试使用它们。编辑值数组以使我需要的更清楚needed@michael什么值[抹布]
mean to you..i总是可以直接访问BEDRAG
。@SandiTransing他可以const\u设置其他东西的值,我只是想向OP展示一种更惯用的方式来做他想要的事情,这就是他要求的。@MichaelKohl啊..OK..使用散列[某物]
和注入({})有什么特别的区别吗
@sanditransing它们是完全不同的东西。Hash[]
将一个由两个元素数组组成的数组转换成散列,而inject
是编程中通常所说的折叠:当然可以使用inject构建散列,但如果已经有两个数组zip
+Hash[]
要容易得多。@michael看重的是[BEDRAG]
mean to you..i总是可以直接访问BEDRAG
。@SandiTransing他可以const\u设置其他东西的值,我只是想向OP展示一种更惯用的方式来做他想要的事情,这就是他要求的。@MichaelKohl啊..OK..使用散列[某物]
和注入({})有什么特别的区别吗
@sanditransing它们是完全不同的东西。Hash[]
将一个由两个元素数组组成的数组转换成散列,而inject
是编程中通常所说的折叠:当然可以使用inject构建散列,但如果已经有两个数组zip
+Hash[]
更简单。请不要添加答案,除非它是您最初发布的问题的选定解决方案。相反,请修改您的原始问题并将您的信息附加到上面。这使搜索的人更容易找到您的解决方案,而不是强迫他们搜索整个问题集。Michael是唯一一个来的人near和我编辑了他的答案以解决一个错误,但即使在更正之后,我认为我的答案更短。因此,请原谅我接受我自己的答案作为最佳解决方案,除非有人提出更简单或更短的答案。请不要添加答案,除非它是您最初发布的问题的选定解决方案。相反,请修改y我们的起源