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