我有这段代码:
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 :(得分:2)
通常,您通过执行一系列构建数据的转换来实现此目的。您对r
的更改将被忽略,这只是重新分配一个后来被丢弃的局部变量,因为您实际上并未将其附加到任何内容。
更好的方法是使用正确的密钥将其作为哈希值返回:
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">}
“访问块外变量”的唯一方法是确保块返回数据,或者在块之前定义变量,以便它们成为闭包的一部分。