неинициализированная константа My_Class :: Accessor (NameError) - метод доступа в верхнем регистре - PullRequest
0 голосов
/ 29 декабря 2010

Когда у меня есть что-то вроде:

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 ]

2 голосов
/ 29 декабря 2010

Это обычная неоднозначность при отправке сообщения / имени переменной в Ruby.

Если вы просто напишите

A

это может быть или сообщение без получателя, отправленное без аргументов или переменная (или в данном случае постоянная).

Ruby разрешает это, предполагая, что это константа.

Решение очевидно: поскольку неоднозначность связана с отправкой сообщения без аргументов без получателя, существует два способа его решения: добавить получателя или добавить аргументы:

self.A
A()

Оба работают просто отлично.

Более подробное объяснение и некоторые примеры см.

2 голосов
/ 29 декабря 2010

В Ruby любое имя, начинающееся с заглавной буквы, является константой.Это означает, что когда интерпретатор видит ваш метод #to_s, он будет искать константу с именем A, а не метод.

Подробнее об этом можно прочитать здесь: http://rubydoc.org/docs/ProgrammingRuby/html/language.html#S3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...