2015-09-22 2 views
-1

У меня есть два класса: TodoList и TodoItem. TodoList имеет массив TodoItem s, и этот массив называется todo_items. Каждый экземпляр TodoItem имеет две переменные экземпляра: name (строка) и complete (boolean).Ссылка на переменные экземпляра в массиве

Я пытаюсь написать метод класса TodoList, чтобы удалить TodoItem из этого массива. Недописанный код ниже для метода TodoList.remove_item работает, но он использует each для прохождения массива todo_items, проверяя TodoItem экземпляр экземпляра name. Я чувствую, что должен быть лучший способ сделать это.

Я пытался заставить его работать, используя include? и delete_at на todo_items, который не работает, потому что его содержание являются экземплярами класса TodoItem.

EDIT: Код для обоих классов TodoList и TodoItem ниже:

ToDoList:

require "./todo_item" 

class TodoList 
    attr_reader :name, :todo_items 

    def initialize(name) 
    @name = name 
    @todo_items = [] 
    end 

    def add_item(name) 
    todo_items.push(TodoItem.new(name)) 
    end 

    def remove_item(name) 
    index = 0 
    found = false 
    todo_items.each do |todo_item| 
     if todo_item.name == name 
     found = true 
     end 
     if found 
     break 
     else 
     index += 1 
     end 
    end 
    if found 
     todo_items.delete_at(index) 
     return true 
    else 
     return false 
    end #if 
    end 

# CODE BELOW DOES NOT WORK 
# if (todo_items.include? 
#  arr_index = todo_items.(#??) 
#  todo_items.delete_at(arr_index) #invalid ref 
#  puts "#{name} was removed from the list" 
# else 
#  puts "That item does not exist in the to do list." 
# end #if 
# end #def remove_item 

end #class TodoList 

TodoItem:

class TodoItem 
    attr_reader :name 

    def initialize(name) 
    @name = name 
    @complete = false 
    end #initialize 

    def to_s 
    if complete? 
     "[C] #{name}" 
    else 
     "[I] #{name}" 
    end 
    end 

    def complete? 
    @complete 
    end 

    def mark_complete! 
    @complete = true 
    end 

    def mark_incomplete! 
    @complete = false 
    end 

end #class TodoItem 
+0

Почему это метод класса? Это не выглядит правильным. – sawa

+0

В чем вопрос? – sawa

+0

'' 'TodoList.remove_item''' предназначен для удаления' '' 'TodoItem''' из массива' '' TodoList.todo_items''', если значение переменной экземпляра '' 'name''' соответствует строка аргумента. Чтобы вы посоветовали? – capecoder

ответ

0

Вы можете использовать Array#delete_if как:

def remove_item(name) 
    todo_items.delete_if { |x| x.name == name} 
end 

И если вы все еще хотите булево быть возвращены, то

def remove_item(name) 
    found = todo_items.index { |x| x.name == name } # return nil if not found or the index. 
    todo_items.delete_if { |x| x.name == name} 
    !!found # turn to boolean 
end 

PS:remove_item должен быть метод экземпляра класса TodoList.

+0

Спасибо. Это имеет смысл, за исключением того, что я не уверен, что '' '' '' '' был бы в этом экземпляре, ссылаясь на экземпляр '' 'TodoItem'''. Например, если я использую свой '' 'TodoList.add_item''', он генерирует новый экземпляр '' '' TodoItem''' и устанавливает переменную '' 'name''' в свой единственный аргумент. Как я могу ссылаться на этот элемент как '' 'x'''? – capecoder

+0

@sofrlowi Может быть, вы должны сначала изучить блоки ruby ​​:) – xdazz

+0

Это на моей дорожке Treehouse! Может быть, я продолжу и вернусь к этому, если это поможет. :) – capecoder

0
def remove_item(name) 
    !!todo_items.reject!{|e| e.name == name} 
end 
Смежные вопросы