uninitialized constant My_Class :: Accessor(NameError) - 大写访问器

时间:2010-12-29 10:08:57

标签: ruby

当我有类似的东西时:

class My_Class
attr_reader :A

def initialize(x)
  @A = x
end

def to_s
  A
end

然后执行:

v = My_Class.new("some value")
puts v

我收到如下错误:

in `to_s': uninitialized constant My_Class::A (NameError)

如果我将访问者更改为以小写字母开头,则可以使用。这是一个我不知道的惯例吗?

2 个答案:

答案 0 :(得分:2)

在Ruby中,任何以大写字母开头的名称都是常量。这意味着当解释器看到您的#to_s方法时,它会查找名为A的常量,而不是方法。

您可以在此处详细了解:http://ruby-doc.org/docs/ProgrammingRuby/html/language.html#S3

答案 1 :(得分:2)

这只是Ruby中正常的无接收者消息发送/变量名称歧义。

如果你只是写

A

它可以 无接收者消息发送,不带参数变量(或者在这种情况下是常量)。

Ruby通过假设它是一个常量来解析它。

解决方案很明显:由于歧义是带有无接收器的无参数消息发送,有两种方法可以解决它:添加接收器或添加参数:

self.A
A()

两者都很好。

有关更深入的解释和一些示例,请参阅