【问题标题】:Iterator calls all elements at once within an each block迭代器在每个块中一次调用所有元素
【发布时间】:2014-03-04 00:38:53
【问题描述】:

我在这里构建数组:

  def initialize
    @names = []
  end

@names << page.all('//*[@id="USERS_AVAIL"]/option').map {|result| result.text.split(", ")}

稍后我尝试通过像这样遍历名称数组来编译和访问 url:

@names.each do |name|
                  visit "https://example.com/k=#{name}&tpe=1"
end

一些 puts 语句告诉我,each 方法一次调用数组的每个元素,而不是按预期进行迭代。即:"https://example.com/k=#{[[%22Adviento%22,%20%22Justin%22],%20[%22Asamoah%22,%20%22Nathan%22],%20[%22Baughman%22,%20%22Zachary%22],}&amp;tpe=1"。 @names.length 的计数只有 4,但 @names 数组的 put 显示正确的输出?我不确定可能出了什么问题,在此先感谢您的帮助。

【问题讨论】:

    标签: ruby arrays loops


    【解决方案1】:

    &lt;&lt; 替换为+=&lt;&lt;整个数组 插入为它自己的单个元素,而 += 将连接数组,这似乎是您的意图。

    例如:

    a = [1,2,3]
    # => [1, 2, 3]
    a << [4,5,6]
    # => [1, 2, 3, [4, 5, 6]] # WRONG
    
    a = [1,2,3]
    # => [1, 2, 3]
    a += [4,5,6]
    # => [1, 2, 3, 4, 5, 6] # CORRECT
    

    试试:

    @names += page.all('//*[@id="USERS_AVAIL"]/option')
              .map { |r| r.text.split(',').map(&:strip) }.flatten
    

    如果引号采用文字形式 %22 并且您想要捕获它们之间的字符串:

    @names += page.all('//*[@id="USERS_AVAIL"]/option')
              .map { |r| r.text.scan(/%22([^%]+)%22/) }.flatten
    

    【讨论】:

    • 呃,这么简单吧?我觉得很傻,你会在 4 分钟内得到你的复选标记,而 SO 会让我这样做。再次感谢。
    • @jcuwaz 没问题;等待投票总是好的,因为我们永远不知道其他人可能有什么有趣的见解或建议。
    • 更新:这仍然只是使用配对元素而不是拆分。现在第一个索引是: [%22Adviento%22,%20%22Justin%22] 我希望它只是“Adviento”,第二个索引是“Justin”;我在捕获阶段的分裂有什么问题吗?
    • 加上几个 gsub,你的更新完全符合我的预期
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2020-12-16
    • 2011-08-15
    • 2018-06-14
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多