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],没有选择对象。