开发者

Ruby "instance variable not initialized" warning

开发者 https://www.devze.com 2022-12-17 17:47 出处:网络
In writing some \"learning the language\" code in ruby, as part of a linkedList implementation, I came across this warning:

In writing some "learning the language" code in ruby, as part of a linkedList implementation, I came across this warning:

In the "add" method, the head is created if it doesn't already exist, i.e.

  def add(value)
   new_node=LinkedListNode.new(value)
   if !@head
    开发者_如何学JAVA @head=new_node
   else
     self.find {|node| node.next ==nil }.next=new_node
   end
  end

I then get the warning

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

How do I get rid of this warning? What's the idiomatic way of doing this?


In addition to Matchu's suggestion, you can also use defined? to initialize @head lazily here without provoking the warning:

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

The normal idiom for this sort of thing is

@head ||= new_node

which will also not provoke the warning, but in this case it seems like you need to do something if @head wasn't defined, and it's not idempotent so ||= is not going to work very well in this case. ||= also has the disadvantage of not being able to distinguish between false, nil or unset. Initializing to nil in initialize is probably the best choice.


You could declare @head as nil in the initialize method, for one.


I think, in those cases, it's better to use native attr_accessor over the defined? check, for example:

 attr_accessor :head

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


You could do something like:

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


You can't perform the ! operation on @head if it doesn't exist. You need to initialize it first. You should probably declare it as nil.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号