Ruby предупреждение "переменная экземпляра не инициализирована" - PullRequest
11 голосов
/ 20 января 2010

При написании некоторого кода «изучения языка» на ruby ​​в рамках реализации связного списка я натолкнулся на следующее предупреждение:

В методе «add» заголовок создается, если он неуже существует, т.е.

  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 ]

20 голосов
/ 20 января 2010

В дополнение к предложению Matchu, вы также можете использовать defined? для ленивой инициализации @head здесь, не вызывая предупреждения:

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

Обычная идиома для такого рода вещей

@head ||= new_node

, что также не вызовет предупреждения, но в этом случае кажется, что вам нужно что-то сделать, если @head не было определено, и это не идемпотентно, поэтому ||= не будет работать очень хорошо вэтот случай.||= также имеет недостаток, заключающийся в том, что он не может различить false, nil или unset.Инициализация nil при инициализации, вероятно, лучший выбор.

10 голосов
/ 20 января 2010

Вы можете объявить @head как nil в методе initialize для одного.

0 голосов
/ 12 февраля 2014

Вы можете сделать что-то вроде:

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
0 голосов
/ 20 января 2010

Вы не можете выполнить операцию ! на @head, если она не существует.Вы должны инициализировать это сначала.Вы, вероятно, должны объявить его как nil.

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