检查警告:找不到字段的声明

Mar*_*rde 5 ruby rubymine

Noob问题.我在包含这个类的文件上运行了RubyMine的Code Inspect.

class Square
  attr_accessor :width

  def area
    @width * @width
  end
end
Run Code Online (Sandbox Code Playgroud)

我很惊讶地收到两条警告@width * @width:

Cannot find declaration for field '@width'

风格指南attr部分对我没有帮助.为什么这是一个警告?

----编辑----
Ruby-Doc说的这个attr-accessor

为此模块定义命名属性,其名称为symbol.id2name,创建一个实例变量(@name)和一个相应的访问方法来读取它.还创建一个名为name=设置属性的方法.字符串参数转换为符号.

对我来说,"定义"意味着它有一个"声明".警告信息没有意义."警告:使用前字段可能未初始化"更准确.

我认为这是一个RubyMine问题(如果它是一个问题).RubyMine显然使用自己的代码检查协议,不使用标准Linter.

Mar*_*rde 5

在这种情况下,RubyMine显示此警告是一个已知问题.


Nab*_*eel 1

看来@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
Run Code Online (Sandbox Code Playgroud)

如果没有它,您在调用时会收到错误Square.new.area(因为在定义正方形时没有设置宽度)。