2010-01-20 30 views
7

Khi viết một số mã "học ngôn ngữ" trong ruby, như một phần của việc triển khai danh sách liên kết, tôi đã xem cảnh báo này:Cảnh báo Ruby "instance variable not initialized"

Trong phương thức "thêm", đầu tạo ra nếu nó không tồn tại, tức là

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

sau đó tôi nhận được cảnh báo

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

làm thế nào để thoát khỏi cảnh báo này? Cách thành ngữ để làm điều này là gì?

+0

Đó là một cảnh báo khủng khiếp là câu trả lời ngắn ... – Kevin

Trả lời

15

Ngoài đề nghị Matchu, bạn cũng có thể sử dụng defined? để khởi @head uể oải ở đây mà không gây cảnh báo:

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

Các thành ngữ bình thường đối với các loại điều này là

@head ||= new_node 

mà sẽ cũng không kích động cảnh báo, nhưng trong trường hợp này có vẻ như bạn cần phải làm điều gì đó nếu @head không được xác định và nó không phải là không đáng tin cậy vì vậy ||= sẽ không hoạt động tốt trong điều này trường hợp. ||= cũng có những bất lợi khi không thể phân biệt giữa sai, không hoặc không được đặt. Khởi tạo thành nil khi khởi tạo có lẽ là lựa chọn tốt nhất.

9

Bạn có thể khai báo @headnil theo phương pháp initialize, cho một.

-4

Bạn không thể thực hiện thao tác ! trên @head nếu nó không tồn tại. Bạn cần phải khởi tạo nó trước. Có lẽ bạn nên khai báo nó là nil.

+3

bạn có thể thực hiện '' trên một var dụ uninitialized, nó chỉ là bạn sẽ nhận được một cảnh báo;!) – horseyguy

0

Bạn có thể làm một cái gì đó như:

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

giá trị gia tăng sẽ không phân tích cú pháp chính xác dưới dạng tên phương thức mọi thứ khác là honky dory –

Các vấn đề liên quan