0

有人可以帮我理解为什么类属性在初始化方法之外丢失了值吗?

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 > 
4

3 回答 3

5

在包括 Ruby 在内的许多编程语言中,变量是作用域的,并且在您的代码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

因此,对于读写访问,您需要提供 writer 方法或使用attr_accessor. 这个答案在例子中解释了它:什么是 attr_accessor in Ruby?

参考:

于 2013-05-23T09:55:21.707 回答
2

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

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
于 2013-05-23T09:59:23.617 回答
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])
于 2013-05-23T09:59:57.337 回答