Как мне сгенерировать константы для доступа к элементам массива Ruby? - PullRequest
0 голосов
/ 30 марта 2012

Я использую массив для хранения значений полей. Для легкого добавления и доступа к элементам я использую константы в качестве идентификаторов элементов.

До сих пор я делал это вручную так:

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, есть предложения?

Ответы [ 4 ]

2 голосов
/ 30 марта 2012

Это самое простое, что я могу придумать, если вы настаиваете на том, чтобы делать это так, как вы описали, и не использовать хэши:

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}
1 голос
/ 30 марта 2012

иначе вы можете заинтересоваться -

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
1 голос
/ 30 марта 2012

Да, используйте Hash и Symbol с.

stages = {:aardf => "aardf", :prest => "prest", ...}
stages[:aardf]

Для наследства используйте

AARDF = :aardf

и

stages[AARDF]

все еще будет работать.

0 голосов
/ 30 марта 2012

Спасибо всем, я многому научился. Майкл был ближайшим со своим ответом, но не прав (массив значений может содержать что угодно, обычно это не порядок элемента). Мне удалось объединить различные техники, представленные здесь, и придумать следующее.

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"]]

что не так гладко

...