Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成常量来访问Ruby数组元素?_Ruby_Arrays_Constants_Eval - Fatal编程技术网

如何生成常量来访问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我们的起源