2014-05-22 39 views
0
class Foobar 
    def initialize 
    self.placeHolder = '' 
    end 
end 

bbq = Foobar.new 

当我运行下面的代码时,我收到一个NoMethodError。这对我来说非常混乱,为什么我不能有一个空的实例变量?我知道我可以有一个空的类变量,但是如果我包含self它会给我这个错误?对象变量不能为空?

回答

3

你的代码试图调用你的类没有的placeHolder=方法。

@placeHolder = '' 

应该为你工作。

或者,你可以加入这一行类:

attr_accessor :placeHolder 

它会自动为你创建一个getter和setter方法。请参阅this answer以获得很好的解释。


当你在做的红宝石someObject.someName,总是意味着调用someName方法上someObject。 (现在你可以伪造一些其他类型的行为,因为你可以定义一个method_missing方法来处理不存在的方法时)。所以,当你做self.someName时,这意味着在类的某个实例上调用someName方法。

+0

好酷。但为什么self.identifier会创建一个方法呢?我来自Python背景,这就是为什么我们在那里声明对象变量的原因。为什么会自动采用它的方法? –

+0

在答案中增加了一些更多的细节,希望能够涵盖您的问题 – JKillian

2

您试图调用Foobar类的实例方法placeHolder=。 Foobar类没有这个方法,所以它正确地给你一个NoMethodError。如果你想设置一个实例变量,那么这样做的语法是@placeholder = ''。如果您想要使用访问器方法,您需要自己写一个或者在课程体中包含attr_accessor :placeHolder

(顺便说一句,它是惯用的Ruby中使用snake_case而非驼峰。)

2

这是因为attr_accessors不在类Foobar的定义。

attr_accessor :placeholder