初始化结束后类属性丢失值

时间:2013-05-23 09:52:27

标签: ruby scope instance-variables

有人可以帮我理解为什么class属性会丢失initialize方法之外的值吗?

2.0.0-p0 :031 > $arr = [1, 2, 3, 4]
 => [1, 2, 3, 4] 
2.0.0-p0 :032 > class Class1
2.0.0-p0 :033?>   def initialize
2.0.0-p0 :034?>     val1 = $arr[0]
2.0.0-p0 :035?>     puts val1
2.0.0-p0 :036?>     end 
2.0.0-p0 :037?>   end 
=> nil 
2.0.0-p0 :038 > cl1 = Class1.new
1   
=> #<Class1:0x007fe8ac16be70> 
2.0.0-p0 :039 > puts cl1.val1

=> nil 
2.0.0-p0 :040 > 

3 个答案:

答案 0 :(得分:5)

在许多编程语言(包括Ruby)中,变量为scoped,而代码val1中的变量位于本地范围。当范围 - 在这种情况下是函数 - 结束时,它被遗忘了。您可能想要一个实例变量。

  

局部变量的名称以小写字母或下划线字符(_)开头。

  

每个对象代表自己的歌曲,因此我们需要每个Song对象随身携带自己的歌曲名称,艺术家和持续时间。这意味着我们需要将这些值存储为对象中的实例变量。在Ruby中,实例变量只是一个以at符号(@)开头的名称。

你有一个实例变量,你可以访问它。

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil

但您无法设置值:

person.name = "miku" # => no method error

因此,对于读取写入权限,您需要提供编写器方法或使用attr_accessor。这个答案在例子中解释了它:What is attr_accessor in Ruby?

参考文献:

答案 1 :(得分:2)

继续@miku的回答你需要将var1定义为实例变量,以便能够在initialize之外访问

irb(main):013:0> class Class1
irb(main):014:1>   attr_accessor :val1
irb(main):015:1>   def initialize
irb(main):016:2>     @val1 = $arr[0]
irb(main):017:2>     puts @val1
irb(main):018:2>     end
irb(main):019:1>   end
=> nil
irb(main):020:0> c = Class1.new
1
=> #<Class1:0x8016f79e0 @val1=1>
irb(main):021:0> puts c.val1
1
=> nil

答案 2 :(得分:2)

你要做的可能是:

class Class1
  def initialize
    @val1 = $arr[0]
    puts @val1
  end 
end

虽然在构造函数的参数中传递要初始化的值可能会更好:

class Class1
  def initialize(val)
    @val1 = val
    puts @val1
  end 
end

cl1=Class1.new($arr[0])