当我有类似的东西时:
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)
如果我将访问者更改为以小写字母开头,则可以使用。这是一个我不知道的惯例吗?
答案 0 :(得分:2)
在Ruby中,任何以大写字母开头的名称都是常量。这意味着当解释器看到您的#to_s
方法时,它会查找名为A
的常量,而不是方法。
您可以在此处详细了解:http://ruby-doc.org/docs/ProgrammingRuby/html/language.html#S3
答案 1 :(得分:2)
这只是Ruby中正常的无接收者消息发送/变量名称歧义。
如果你只是写
A
它可以 无接收者消息发送,不带参数或变量(或者在这种情况下是常量)。
Ruby通过假设它是一个常量来解析它。
解决方案很明显:由于歧义是带有无接收器的无参数消息发送,有两种方法可以解决它:添加接收器或添加参数:
self.A
A()
两者都很好。
有关更深入的解释和一些示例,请参阅