class Foobar
def initialize
self.placeHolder = ''
end
end
bbq = Foobar.new
当我运行下面的代码时,我收到一个NoMethodError
。这对我来说非常混乱,为什么我不能有一个空的实例变量?我知道我可以有一个空的类变量,但是如果我包含self
它会给我这个错误?对象变量不能为空?
class Foobar
def initialize
self.placeHolder = ''
end
end
bbq = Foobar.new
当我运行下面的代码时,我收到一个NoMethodError
。这对我来说非常混乱,为什么我不能有一个空的实例变量?我知道我可以有一个空的类变量,但是如果我包含self
它会给我这个错误?对象变量不能为空?
你的代码试图调用你的类没有的placeHolder=
方法。
@placeHolder = ''
应该为你工作。
或者,你可以加入这一行类:
attr_accessor :placeHolder
它会自动为你创建一个getter和setter方法。请参阅this answer以获得很好的解释。
当你在做的红宝石someObject.someName
,总是意味着调用someName
方法上someObject
。 (现在你可以伪造一些其他类型的行为,因为你可以定义一个method_missing
方法来处理不存在的方法时)。所以,当你做self.someName
时,这意味着在类的某个实例上调用someName
方法。
您试图调用Foobar类的实例方法placeHolder=
。 Foobar类没有这个方法,所以它正确地给你一个NoMethodError。如果你想设置一个实例变量,那么这样做的语法是@placeholder = ''
。如果您想要使用访问器方法,您需要自己写一个或者在课程体中包含attr_accessor :placeHolder
。
(顺便说一句,它是惯用的Ruby中使用snake_case而非驼峰。)
这是因为attr_accessors不在类Foobar的定义。
attr_accessor :placeholder
好酷。但为什么self.identifier会创建一个方法呢?我来自Python背景,这就是为什么我们在那里声明对象变量的原因。为什么会自动采用它的方法? –
在答案中增加了一些更多的细节,希望能够涵盖您的问题 – JKillian