Как «поместить» список номеров в массив, используя цикл «до» - PullRequest
0 голосов
/ 17 октября 2019

Я использую петли и счетчик, чтобы вывести нумерованный список предметов. Он перечисляет их все сразу под 1, а затем 2 - еще один раунд перечисления всех элементов.

Цикл while не работает, и я подумал, что until было лучше. Я также переместил counter за пределы первой итерации, но это тоже не сработало.

require 'pry'
require 'rubygems'
require 'open-uri'
require 'nokogiri'

class KefotoScraper::CLI
  def initialize
    @product_names = []
    @page_url = "https://kefotos.mx/"
  end

  def call
    puts "These are the services that Kefoto offers:"
    list_products
  end

  private

  def home_html
    Nokogiri::HTML(open(@page_url))
  end

  def service_names
    @service_names = home_html.css(".nav-link").map do |link|
      link['href'].to_s.gsub(/.php/, "")
    end

    @service_names.each do |pr|
      @product_names << pr
    end

    @product_names
  end

  def list_products
    i = 1
    n = 0

    until @product_names.length < n do
      @product_names.each {|list_item| puts "#{i} #{list_item}"}
      i += 1
      n += 1
    end
  end

  def service_links
    @service_links ||= home_html.css(".nav-item").map { |link| link['href'] }
  end
end

Список повторяется снова и снова.

[3] pry(#<KefotoScraper::CLI>)> @product_names
=> ["foto-enmarcada", "impresion-fotografica", "photobooks", "impresion-directa-canvas", "impresion-acrilico", "fotoregalos"]
[4] pry(#<KefotoScraper::CLI>)> list_products
1 foto-enmarcada
1 impresion-fotografica
1 photobooks
1 impresion-directa-canvas
1 impresion-acrilico
1 fotoregalos
2 foto-enmarcada
2 impresion-fotografica
2 photobooks
2 impresion-directa-canvas
2 impresion-acrilico
2 fotoregalos

1 Ответ

2 голосов
/ 17 октября 2019
def list_products
  @product_names.each_with_index do |list_item, i|
    puts "#{i} #{list_item}"
  end
end

edit: спасибо за отзыв, Жестянщик. С вашим текущим кодом вы перебираете @product_names один раз с until, а внутри этого вы перебираете @product_names с .each. Например, если @product_names.length == 3, вы напечатаете 3 * 3 == 9 раз!

Поскольку вам нужно всего лишь один раз просмотреть @product_names, выберите until или .each. Мой пример выше использует .each, а вот пример использования until:

i = 1
until @product_names.length < i do
  puts "#{i} #{@product_names[i-1]}"
  i += 1
end
...