初始化Ruby对象中的属性

初始化Ruby对象中的属性,ruby,arrays,initialization,Ruby,Arrays,Initialization,我创建了一个类型为Spam的新对象,其中hooray和name都有attr_访问器,我有initialize方法。我希望在创建一个新对象时,该对象会加载一个名为Whammy的变量和一个名为hooray的空数组。虽然我没有这种行为。谁能解释一下,先谢谢你 module Test class Spam attr_accessor :hooray, :name def initialize hooray = [] name = "Whammy" end end end Lo

我创建了一个类型为Spam的新对象,其中hooray和name都有attr_访问器,我有initialize方法。我希望在创建一个新对象时,该对象会加载一个名为Whammy的变量和一个名为hooray的空数组。虽然我没有这种行为。谁能解释一下,先谢谢你

module Test
class Spam
 attr_accessor :hooray, :name

 def initialize
    hooray = []
    name = "Whammy"
 end
end 
end

Loading development environment (Rails 3.0.0)
irb(main):001:0> require 'Test'
=> nil
irb(main):002:0> test = Test::Spam.new
=> #<Test::Spam:0x000000031ff470>
irb(main):003:0> test.name
=> nil
irb(main):004:0> test.hooray
=> nil
irb(main):005:0> test.hooray << 5
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.<<
    from (irb):5
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/commands/console.rb:44:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/commands/console.rb:8:in `start'
    from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/commands.rb:23:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
irb(main):006:0> 

您希望在类的实例中使用实例变量来定义属性,而不是局部变量。一旦方法完成执行,局部变量就会超出范围。下面的代码应该更符合您的需要:

module Test
class Spam
 attr_accessor :hooray, :name

 def initialize
    @hooray = []
    @name = "Whammy"
 end
end 
end

您希望在类的实例中使用实例变量来定义属性,而不是局部变量。一旦方法完成执行,局部变量就会超出范围。下面的代码应该更符合您的需要:

module Test
class Spam
 attr_accessor :hooray, :name

 def initialize
    @hooray = []
    @name = "Whammy"
 end
end 
end

这里的问题是,您试图在initialize方法中直接使用setter,但Ruby将其解释为创建局部变量,而不是在self上调用setter

您可以通过以下两种方式之一解决此问题:;直接设置属性,如@attribute:

或者,如果您真的想查看setter,例如,如果您有做一些有趣事情的自定义setter,请使用self.setter使其显式:


这里的问题是,您试图在initialize方法中直接使用setter,但Ruby将其解释为创建局部变量,而不是在self上调用setter

您可以通过以下两种方式之一解决此问题:;直接设置属性,如@attribute:

或者,如果您真的想查看setter,例如,如果您有做一些有趣事情的自定义setter,请使用self.setter使其显式:


谢谢,我甚至没有想过。谢谢,我甚至没有想过。谢谢你的解释谢谢你的解释Test可能不是一个好的模块名,因为Test::Unit将Test作为一个模块。Test可能不是一个好的模块名,因为Test::Unit将Test作为一个模块。
 def initialize
    @hooray = []
    @name = "Whammy"
 end
 def initialize
    self.hooray = []
    self.name = "Whammy"
 end