如何理解Ruby中的数组和循环



关于以下代码:

更新:

(感谢DGM和The Tin Man对代码的建议和标题的解释。)

#################
# get main page
#################
  rows = doc.xpath('//table[@class="articulos"]/tr[td[5]/p/b]')
  i = 0
  details = rows.each do |row|
    detail = {}  
    [
      [:sku, 'td[3]/text()'],
      [:desc, 'td[4]/text()'],
      [:stock, "td[5]/p[@title]"],
      [:price, 'td[6]/text()']
    ].each do |name, xpath|
        detail[name] = row.at_xpath(xpath).to_s.strip
      end
    i = i + 1
    if detail[:sku] != ""
          price = detail[:price].split
          if price[1] == "D"
              currency = 144
          else
              currency = 168
          end
          stock = detail[:stock].gsub(/[^d]/, '')
          cost = price[0].gsub(",", "").to_f
  end
  • 第一个i = 0i = i + 1是否必要
  • 这使用了什么语法?details = rows.each do |row|
  • 为什么要使用detail = {}?这是在干什么
  • 我确实理解.each do |name,xpath|,因为它的顺序是:namexpath
  • 我猜detail[name] = row.at_xpath(xpath).to_s.strip的意思是,如果我调用detail[:sku],它将使xpath处的那一行成为字符串条

对于我所理解的,在阅读了Ruby Poignant Book之后,阅读了我上面写的代码,我也许可以翻译成Ruby逻辑单词?。如果这不是对Ruby专家的侮辱,哈哈。

首先,我们有一个方法的循环,在另一个方法中有一个数组。

variable = variable.method block |block argument|
  variable = {block}
  [ array of arrays
    [ symbol_1, 'string'],
    [ symbol_2, 'string'],
    [ symbol_3, 'string'],
    [ symbol_4, 'string'],
    [ symbol_5, 'string'],
    [ symbol_6, 'string']
  ].method block |symbol, string|
    variable[symbol] = variable.method(method argument).method.kernel_method
  end block
end block

这是正确的吗?现在我需要解释一下,使用代码中的方法、变量和参数的实际名称,可以看到:

rows变量获取一个collect消息,以收集包含符号和xpath的数组中的一行,并且对于每个数组块,该行和xpath将应用内核方法条?

第一个i=0,i=i+1(为什么这里的必需品?)

没用,你是对的

details=rows.collect do|row|what这是语法吗?阵列?还是怎样类正在使用nokogiri?做野村与此事有任何关系还是仅仅是RUBY在处理一个对象。

它是纯粹的ruby风格,它循环应该是数组的元素。

它还重新创建存储在details中的数组,该数组包含循环结束时声明的每个元素。这是detail

detail={}您可以看到这一点。为什么你想用这个吗?这个行吗我不是在做什么?

它将detail初始化为空散列,然后在collect循环中填充该散列。

我确实理解|name,xpath|因为顶部在order in name,xpath detail[名称]=row.at_xpath(xpath).to_strip我想这是说如果我打电话detail[:sku]它会在把xpath转换成字符串?

正确。

地图做什么?有语法吗在nokogiri页面上的教程?

map循环应该是Hash的所有元素。它创建一个包含链接的数组。由于uniq! ,从该阵列中删除了重复的链路

注意这个函数末尾的bang,这意味着它改变了对象。

为什么他必须重复所有数据在#walk-through分页器中只是使用idk某个变量?

不理解这个问题。

细节<lt;细节我知道这叫做推一下?那为什么有人想推一些相同的名字哈哈。。。

这是一个推送,但它是details << detail,所以逻辑是安全的。

总之,这不是一个漂亮的代码,但它似乎是功能性的:)

需要注意的是,我最近在自己的代码中做到了这一点:

      detail = {}
      [
              [:sku, 'td[3]/text()'],
              [:desc, 'td[4]/text()'],
              [:qty, 'td[5]/text()'],
              [:qty2, 'td[5]/p/b/text()'],
              [:title, 'td[5]/p/@title'],
              [:price, 'td[6]/text()']
      ].collect do |name, xpath|
              detail[name] = row.at_xpath(xpath).to_s.strip
      end

collect语句的结果被抛出,而将内容填充到detail中的副作用是主要关注的问题。在这种情况下,collect可以更改为each。

      detail = {}
      [
              [:sku, 'td[3]/text()'],
              [:desc, 'td[4]/text()'],
              [:qty, 'td[5]/text()'],
              [:qty2, 'td[5]/p/b/text()'],
              [:title, 'td[5]/p/@title'],
              [:price, 'td[6]/text()']
      ].each do |name, xpath|
              detail[name] = row.at_xpath(xpath).to_s.strip
      end

相关内容

  • 没有找到相关文章

最新更新