Ruby 访问块外的变量
我有以下代码:Ruby 访问块外的变量,ruby,block,Ruby,Block,我有以下代码: 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,例如街区外 有什么解决办法吗
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,例如街区外
有什么解决办法吗 通常,您可以通过执行一系列转换来构建数据。您对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">}
访问块外变量的唯一方法是确保块返回数据,或在块之前定义变量,使其成为闭包的一部分。通常,通过执行一系列转换来构建数据。您对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">}
访问块外变量的唯一方法是确保块返回数据,或者在块之前定义变量,使其成为闭包的一部分。来自.zip块。该迭代中的每个r都是小写的。如果我在.zip块中,执行pr和pn,我分别得到[slect,choice,prime]和[slect,choice,prime],没有选择对象。它来自.zip块。该迭代中的每个r都是小写的。如果我在.zip块中,执行pr和pn,我分别得到[slect,choice,prime]和[slect,choice,prime],没有选择对象。