迭代器在每个块中一次调用所有元素

时间:2014-03-04 00:38:53

标签: ruby arrays loops

我在这里构建数组:

  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

一些put语句向我展示了每个方法都是一次性调用数组的每个元素,而不是按预期迭代。 I.E。:"https://example.com/k=#{[[%22Adviento%22,%20%22Justin%22],%20[%22Asamoah%22,%20%22Nathan%22],%20[%22Baughman%22,%20%22Zachary%22],}&tpe=1"。 @ names.length的计数只有4,但@names数组的put会显示正确的输出?我不确定会出现什么问题,提前感谢任何协助。

1 个答案:

答案 0 :(得分:2)

<<替换为+=<<整个数组作为其自身的单个元素插入,而+=将连接数组,这似乎是您的意图。

例如:

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