2015-06-17 2 views
-1

В этом itteration:Назначение локальной переменной, имя которого задано в виде строки

a1=[1,2,3,4,5] 
a2=[1,2,3,4,5] 
a1.each_with_index{|a, i| ... = a + a2[i]} 

Я хочу, чтобы присвоить различные локальные переменные b1, b2, ..., b5, каждый из каждой итерации, чтобы получить:

b1 # => 2 
b2 # => 4 
b3 # => 6 
b4 # => 8 
b5 # => 10 

Я пробовал:

a1.each_with_index{|a, i| ('b' + i.to_s) = a + a2[i]} 

, но это не сработает. У кого-нибудь есть идеи?

+2

Это скорее всего, XY-вопрос. – sawa

+0

Я не думаю, что вы можете создать локальную переменную в области метода each_with_index, который будет сохраняться при завершении этой области. –

ответ

0

Попробуйте использовать instance_variable_set

+1

'instance_variable_set' устанавливает переменную экземпляра, а не локальную переменную. –

0

То, что вы пытаетесь сделать (динамически создавать локальные переменные) не делает много смысла для меня. Почему бы вам просто не использовать массив.

a1=[1,2,3,4,5] 
a2=[1,2,3,4,5] 

a1.zip(a2).inject([]) { |b, (x1, x2)| b << x1 + x2 } 

=> [2, 4, 6, 8, 10] 

Вы достигнете того же результата. Элемент в позиции b[0] будет представлять собой сумму a1[0] + a2[0].

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

Другими словами, как бы вы когда-либо могли использовать b4, если вы даже не знаете, было ли создано b4. Вот почему массив более удобен, вы можете узнать размер массива и получить доступ ко всем его элементам.

Вы можете создать локальную переменную, используя eval, но, как я уже сказал, это определенно не лучший подход.

+0

спасибо, как я сказал, пример был упрощен, поэтому это решение не совсем подходит. Однако, будь то правильный способ сделать это или нет, я предполагаю, что нет способа делать то, что я ищу? Я предполагаю, что невозможно использовать строку для определения имени переменной? Я попытался использовать eval, но не смог заставить его работать. Я могу вызвать переменную с помощью eval, но не определить один ... – treeseal7

+0

Определение переменной в 'eval' * does * work. Он определяется внутри привязки вызова eval. Он не определен вне его. Вот как работают локальные переменные. –

0

Вы можете использовать Binding#local_variable_set для установки уже существующих локальных переменных. Однако, когда вы используете его для установки локальной локальной переменной (IOW для ее определения), новая локальная переменная будет определена внутриBinding объект, но не внешний Binding вы создали его.

То же самое происходит с eval. До Ruby 1.8, eval просочились локальные переменные во внешний охват, но эта утечка была подключена к Ruby 1.9.

Короче говоря, то, что вы хотите, невозможно.

0

Вы должны использовать объект Binding.

a1=[1,2,3,4,5] 
a2=[1,2,3,4,5] 
b = binding() 
a1.each_with_index{ |a, i| eval("b#{i + 1} = #{a + a2[i]}", b) } 
(1..5).each do |i| 
    eval("puts b#{i}", b) 
end 

Теперь, когда локальная переменная установлена, вы сможете получить к ней доступ через эту привязку.

Вы можете увидеть пример HERE

Смежные вопросы