有人可以帮我理解为什么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 >
答案 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])