Исходя из пользовательского ввода, я хотел бы найти по имени для объекта в списке, который я имею в моем CLI - PullRequest
0 голосов
/ 24 января 2020

Я делаю CLI, у которого есть 100 объектов, у каждого есть имя, и я хотел бы создать опцию для поиска в моем списке из 100 объектов, чтобы найти объект по имени. Какую реализацию лучше всего использовать здесь.

Для начала я предполагаю, что в Ruby я могу использовать .find? Мой текущий WIP ниже. Любая помощь приветствуется.

class PokeDEXCLI::Pokemon
    attr_accessor :name, :id, :height, :weight

    @@all = []

    def initialize(attr_hash)
        attr_hash.each do |key, value|
            self.send("#{key}=", value) if self.respond_to?("#{key}=")
    end
    self.save
  end

 def save
    @@all << self
 end

 def self.all
    @@all
 end
end

Я думал, что я могу искать по вводу, чтобы найти, выполнив сначала что-то подобное?

def self.find_by_name(input)
      puts " Would you like to search by pokemon name? Please type in your query."
      input = gets.chomp
       if @@all.include? input
          (this is where I am unsure how to compare input to the :name attribute)
end       

Так что я думаю, что я буду использовать приведенный ниже фрагмент. Мой другой вопрос: могу ли я добавить аргумент по умолчанию для name, чтобы он возвращал nil, если совпадений нет?

class Pokemon
  def self.find_by_name(name = nil)
    @@all.select { |pokemon| pokemon.name.include?(name) }
  end
end

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Если коллекция принимает объекты с уже существующими именами, используйте метод select для возврата коллекции совпадающих имен

class Pokemon
  def self.find_by_name(name)
    @@all.select { |pokemon| pokemon.name == name }
  end
end

Если вы хотите найти объекты, имена которых содержат данную строку, используйте один и тот же подход с разными условие

class Pokemon
  def self.find_by_name(name)
    @@all.select { |pokemon| pokemon.name.include?(name) }
  end
end

Если коллекция принимает только уникальные имена, коллекция может быть реализована с использованием Hash

class Pokemon
  @@all = {}

  def self.find_by_name(name)
    @@all[name]
  end

  def save
    @@all[name] == self
  end
end
0 голосов
/ 24 января 2020

этот метод класса может помочь вам, если у вашего класса 'Pokemon' есть attr_accessor 'name'

def self.find_by_name(search_string)
    result = []
    ObjectSpace.each_object(self) { |pokemon| result << pokemon if pokemon.name.include?(search_string) }
    result
  end

он вернет массив покемонов с именем, включая строку поиска

0 голосов
/ 24 января 2020

Подход Ruby здесь заключается в использовании Ha sh:

OBJECTS = {
  shoe: 'A shoe',
  rose: 'A red flower',
  dog: 'A yappy dog'
  cat: 'Some orange blur'
}

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

Где вы можете ссылаться на это так:

OBJECTS[:shoe]

Или на основе ввода:

OBJECTS[gets.chomp.to_sym]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...