2016-06-10 9 views
3

Noob вопрос. Я запустил RubyMine's Code Inspect в файле, содержащем этот класс.Осмотр Предупреждение: Не удается найти декларацию для поля

class Square 
    attr_accessor :width 

    def area 
    @width * @width 
    end 
end 

Я был удивлен, чтобы получить два предупреждения на линии @width * @width:

Cannot find declaration for field '@width'

attr section of the Style Guide не было полезно для меня. Почему это предупреждение?

---- Редактировать ----
Ruby-Doc говорит это о attr-accessor

Определяет именованный атрибут для этого модуля, где имя является символом . id2name, создавая переменную экземпляра (@name) и соответствующий метод доступа для ее чтения. Также создается способ, называемый name= для установки атрибута. Строковые аргументы преобразуются в символы.

Для меня «Определяет» означает, что у него есть «объявление». Предупреждающее сообщение не имеет смысла. «Предупреждение: поле не может быть инициализировано перед использованием» более точно.

Я думаю, что это проблема RubyMine (если это вообще проблема). RubyMine apparently uses its own code inspection protocol и не использует стандартный Linter.

ответ

0

Кажется @width не инициализируется.

class Square 
    attr_accessor :width 

    def initialize(width) 
    @width = width 
    end 

    def area 
    @width * @width 
    end 
end 

x = Square.new(4) 
#=> #<Square:0x00000002371ef8 @width=4> 
x.area 
#=> 16 

Без этого вы получите сообщение об ошибке при вызове Square.new.area (как квадрат был определен без ширины быть установлена).

+0

Согласитесь об инициализации. Но мне кажется, что 'attr_accessor: width' является объявлением. –

+0

'' attr_accessor'' является ярлыком для двух методов, которые устанавливают и получают ширину. ('' def width, @width; end'' и '' def width = (width); @width = width; end''). Однако, с самого первого чтения (без написания), это будет nil, поэтому я думаю, что Rubymine возвращает ошибку (я никогда не использовал Rubymine, поэтому не могу точно прокомментировать ошибку). Я предполагаю, что это не рассматривается как декларация, поскольку они не являются переменными, а методами. –

+0

Я смотрю на ruby-doc.com для официальной информации, тогда я попытаюсь выяснить, использует ли RubyMine Linter, например 'rubocop'. –

4

Это known issue. Добавление ненужных слов для соответствия минимальной длине сообщения.

+0

Кажется, известно с мая 2013 года. Это может помочь, если мы будем голосовать/комментировать эту проблему. – qbantek