Ruby "instance variable not initialized" 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
.
精彩评论