2016-12-08 2 views
0

У меня есть этот код:доступа к переменным вне блока

grades = ["Slect", "Choice", "Prime"] 
names = grades.map{ |j| j.downcase } 
names.zip(grades) do |r,n| 
    r = Steak.new 
    r.grade = n 
    r 
end 

ObjectSpace.each_object(Steak) {|x| p x} 

показывает, что Steak имеет 3 экземпляров и классов получить правильные значения, присвоенные.

Но я не могу получить доступ к choice, например, за пределами блока.

любые решения?

+0

, который исходит из .zip блока. Каждый «r» в этой итерации оценивается в нижнем регистре. Если я внутри блока .zip и делаю 'pr' и' pn', я получаю соответственно '[« выбор »,« выбор »,« простой ») и« [«выбор», «выбор», «премьер» "]' – thiebo

+0

нет объекта 'choice'. –

ответ

2

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

Лучший способ, чтобы вернуть это как Hash с правой клавиши:

class Steak 
    attr_accessor :grade 
end 

grades = [ "Select", "Choice", "Prime" ] 

map = Hash[ 
    grades.map do |grade| 
    steak = Steak.new 
    steak.grade = grade.downcase 

    [ grade, steak ] 
    end 
] 

# => {"Select"=>#<Steak:0x007fc6ef01bd60 @grade="select">, "Choice"=>#<Steak:0x007fc6ef01bcc0 @grade="choice">, "Prime"=>#<Steak:0x007fc6ef01bc20 @grade="prime">} 

Единственный способ «переменные доступа за пределами блок-», чтобы убедиться, что блок возвращает данные, или иметь переменные, определенные перед блоком, поэтому они являются частью закрытия.

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