首页 > 解决方案 > 如何使用“直到”循环“放置”数组中的项目数列表

问题描述

我正在使用循环和计数器来列出一个编号的项目列表。它在 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

标签: rubyloopsnokogiri

解决方案


def list_products
  @product_names.each_with_index do |list_item, i|
    puts "#{i} #{list_item}"
  end
end

编辑:感谢铁皮人的反馈。使用您当前的代码,您正在循环@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

推荐阅读