Метод поиска в массиве Ruby не работает должным образом

Мне не удается заставить работать метод поиска, который я написал в своем скрипте. Вот соответствующий код из скрипта:

$records = []

def xml_extractor(document)
    document.xpath("//record").each do |record|
        $records << {"id" => record.xpath('id').text, 
            "first_name" => record.xpath('first_name').text, 
            "last_name" => record.xpath('last_name').text, 
            "email" => record.xpath('email').text, 
            "gender" => record.xpath('gender').text, 
            "ip_address" => record.xpath('ip_address').text,
            "send_date" => record.xpath('send_date').text,
            "email_body" => record.xpath('email_body').text,
            "email_title" => record.xpath('email_title').text}
            puts record
        end
    puts "\nAll records loaded!"
end


def search_by_ip(ip)
    record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
    puts JSON.pretty_generate(record_to_return) 
end

В основном мой метод xml_extractor работает нормально и сохраняет все в массиве с помощью nokogiri. XML-файл, который реализуется, имеет тысячу записей, каждая из которых имеет собственное имя_файла, имя_последнего и т. д. Но проблема в том, что когда я пытаюсь реализовать метод search_by_ip в массиве, возвращается значение "null", тогда как метод должен быть на самом деле do возвращает всю запись, принадлежащую этому конкретному IP-адресу. Кроме того, я понял, что каждый раз, когда я реализую метод xml_extractor, то есть когда XML-документ анализируется в массиве, содержимое на самом деле не сохраняется, а отображается только на время выполнения цикла. Возможно, поэтому я получаю «ноль» для моих методов поиска. Дайте мне знать, что вы думаете, ребята.

пусть ваш xml_extractor возвращает записи, нет необходимости в общедоступной переменной, проверьте содержимое того, что возвращается, передайте этот массив в качестве второго параметра search_by_ip. Еще лучше сделать записи класса коллекции с его методами, такими как search_by_ip

peter 18.03.2018 12:53

Извините, но не могли бы вы подробнее рассказать о своих пунктах в коде, потому что я новичок в Ruby, я понимаю ваши пункты, я просто действительно не знаю, как их реализовать. Благодарю.

user8148960 19.03.2018 01:18
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
2
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В ruby ​​ваш метод вернет последнюю строку. Если вы хотите, чтобы ваш метод возвращал данные, вам нужно вернуть их в последней строке. puts ничего не возвращает. Попробуйте изменить вот так:

def search_by_ip(ip)
  record_to_return = $records.select {|k| k["ip_address"] == ip.to_s}
  puts JSON.pretty_generate(record_to_return)
  record_to_return
end
Ответ принят как подходящий

Я написал пример того, как использовать объектно-ориентированный объект для получения желаемого. У меня нет вашего документа, поэтому я упростил его до двухмерного массива В методе read переключите комментарий для работы с вашим xml Каждый метод можно связать в цепочку, и он делает только то, что требуется Все они могут быть протестированы отдельно (здесь, поставив их)

class Xml_extractor

  attr_reader :document, :records

  def initialize document
    @document = document
    @records  = []
  end

  def read
    # @document.xpath("//record").each do |record|
    @document.each do |record|
      @records << {id: record[0], ip_address: record[1]}
    end
    self # return self so that you can chain another method
  end

  def search_by_ip(ip)
    #return first of an array if found, nil otherwise
    # attention to use a hash key here to search, not a string
    @records.select {|k| k[:ip_address] == ip.to_s}.first
  end

end

document = [[0, "192.168.0.1"], [1, "192.168.0.2"]]
p Xml_extractor.new(document).read.records
# [{:id=>0, :ip_address=>"192.168.0.1"}, {:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2")
# [{:id=>1, :ip_address=>"192.168.0.2"}]
p Xml_extractor.new(document).read.search_by_ip("192.168.0.2").to_json
# "[{\"id\":1,\"ip_address\":\"192.168.0.2\"}]"

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

user8148960 21.03.2018 11:00

пожалуйста, не могли бы вы принять ответ и проголосовать за?

peter 22.03.2018 12:51

извините, я новичок на сайте, поэтому не знал, как это сделать, но я дал вам много, еще раз спасибо

user8148960 22.03.2018 22:41

Я не вижу изменений, вам нужно нажать на галочку слева от моего ответа, иначе ответ останется без ответа. Голосование осуществляется путем нажатия стрелки вверх над цифрой 0.

peter 23.03.2018 00:18

Другие вопросы по теме