代码之家  ›  专栏  ›  技术社区  ›  Steve B.

Ruby“实例变量未初始化”警告

  •  11
  • Steve B.  · 技术社区  · 15 年前

    在用Ruby编写一些“学习语言”代码时,作为LinkedList实现的一部分,我遇到了以下警告:

    在“添加”方法中,如果头部不存在,即

      def add(value)
       new_node=LinkedListNode.new(value)
       if !@head
         @head=new_node
       else
         self.find {|node| node.next ==nil }.next=new_node
       end
      end
    

    然后我得到警告

    .../linked_list.rb:13: warning: instance variable @head not initialized
    

    我该如何摆脱这个警告?这样做的惯用方法是什么?

    4 回复  |  直到 11 年前
        1
  •  20
  •   Eoin Kelly    12 年前

    除了Matchu的建议,您还可以使用 defined? 初始化 @head 在这里懒散而不引起警告:

    if defined? @head
      ...
    else
      @head = new_node
    end
    

    这类事情的常见习惯用法是

    @head ||= new_node
    

    这也不会引起警告,但在这种情况下,如果 @头 没有定义,也不是等幂的,所以 ||= 在这种情况下不会很好地工作。 = 也有缺点,无法区分虚假、零或未设置。正在初始化到 nil 在初始化中可能是最佳选择。

        2
  •  10
  •   Matchu    15 年前

    你可以申报 @head 作为 nil initialize 方法。

        3
  •  0
  •   Nerdman    11 年前

    你可以这样做:

    def position
      self.find {|node| node.next.nil? }
    end
    
    def head
      @head ||= nil
    end
    
    def add value
      node = LinkedListNode.new(value)
      head ? position.next = node : @head = node
    end
    
        4
  •  -4
  •   Michael Dickens    15 年前

    你不能表演 ! 操作上 @head 如果它不存在。您需要先初始化它。你应该把它声明为 nil .