Удалить массив из класса в ruby - PullRequest
0 голосов
/ 14 ноября 2018

Итак, я создаю класс в ruby, где я смогу вставить свои данные в текстовый файл, а затем прочитать, найти из него, но я застрял при удалении, а также обновить / редактировать.

По сути, я создал метод с именем «find» и сделал его ссылкой на мой метод «delete».

def find(keyword="")
  if keyword
    person = People.read_people
    found = person.select do |pip|
      pip.name.downcase.include?(keyword.downcase) ||
        pip.age.downcase.include?(keyword.downcase) ||
        pip.country.downcase.include?(keyword.downcase)
    end
    found.each do |person|
      puts person.name + " | " + person.age + " | " + person.country
    end
  else
    puts "find using a key phrase eg. 'find sam' \n\n"
  end
end


def list
  puts "\nListing People \n\n".upcase
  people = People.read_people
  people.each do |person|
    puts person.name + " | " + person.age + " | " + person.country
  end
end


def delete(keyword="")
  if keyword
    person = People.read_people
    found = person.select do |pip|
      pip.name.downcase.include?(keyword.downcase) ||
        pip.age.downcase.include?(keyword.downcase) ||
        pip.country.downcase.include?(keyword.downcase)
    end
    person.delete(found)
  else
    puts "find using a key phrase eg. 'find josh' \n\n"
  end
end

Как видите, я пытался удалить предоставленное ключевое слово из массива (w /c был сохранен в текстовом файле) через метод класса read_people.Вот как это выглядит:

def self.read_people
  # read the people file
  # return instances of people
  people = []
  if file_usable?
    file = File.new(@@filepath, 'r')
    file.each_line do |line|
      people << People.new.import_line(line.chomp)
    end
    file.close
  end
  return people
end

def import_line(line)
  line_array = line.split("\t")
  @name, @age, @country = line_array
  return self
end

Как это исправить и удалить найденный элемент по ключевому слову?

См. Фактические коды здесь: https://repl.it/repls/VastWildFact

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

В основном вам понадобится метод export_people и write_people, который будет выглядеть примерно так:

def self.export_people(people)
  people.map do |person|
    [person.name, person.age, person.country].join("\t")
  end
end

def self.write_people(people)
  File.new(@@filepath, 'w') do |f|
    f.write(export_people(people))
  end
end

# Usage:
Person.write_people(array_of_people)

С помощью приведенного выше кода вы бы назвали модифицированнымdelete метод, описанный в ответе Тарека , а затем Person.write_people(array_of_people) для обратной записи в файл.

0 голосов
/ 14 ноября 2018

Изменить

person.delete(found)

на

person -= found # Equivalent to person = person - found

Должно работать в соответствии с https://ruby -doc.org / core-2.2.0 / Array.html # методом-i-2D

ary - other_ary → new_ary

Возвращает новый массив, который является копией исходного массива, удаляя все элементы, которые также появляются в other_ary.Порядок сохраняется из исходного массива.

Он сравнивает элементы, используя их хэш и eql?методы повышения эффективности.

Пример: [1, 1, 2, 2, 3, 3, 4, 5] - [1, 2, 4] # => [3, 3, 5]


Другое решение заключается в использовании reject следующим образом:

person.reject! do |pip|
  pip.name.downcase.include?(keyword.downcase) ||
    pip.age.downcase.include?(keyword.downcase) ||
    pip.country.downcase.include?(keyword.downcase)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...