代码之家  ›  专栏  ›  技术社区  ›  jbk

在设置这些实例变量时,我做错了什么?

  •  0
  • jbk  · 技术社区  · 8 年前

    Quote 我呼叫时的实例 Quote#scrape_quote .我可以看到这些值被刮取并保存到scraped_values散列中。很好,当我调用时,我无法访问变量 quote.lives nil .

    我做错了什么?

    class Quote < ApplicationRecord 
      require 'watir'
      attr_accessor :lives, :benefit, :payment
    
      def scrape_quote
        rows = @browser.trs
        quote_rows = rows[1..8]
        scraped_values = {}
    
        quote_rows.each do |row|
          scraped_values[row.tds[0].text] = row.tds[1].text
        end
    
            @lives      = scraped_values[0]
            @benefit    = scraped_values[1]
            @payment    = scraped_values[2]
    
        puts scraped_values
      end
    end
    
    4 回复  |  直到 8 年前
        1
  •  3
  •   seph    8 年前

    刮取的_值是散列而不是数组。您正在尝试访问它,就像它是一个数组一样。

    row.tds[0].text 要引用哈希,请执行以下操作:

    h = {a:1,b:2}
    h[:a]
    => 1 
    
        2
  •  2
  •   Segfault    8 年前

    如果您只想将哈希值顺序分配给成员变量,可以使用 hash#values

    2.4.1 :001 > h = {}
     => {} 
    2.4.1 :002 > h[:one] = 1
     => 1 
    2.4.1 :003 > h[:two] = 2
     => 2 
    2.4.1 :004 > h[:three] = 3
     => 3 
    2.4.1 :005 > @one, @two, @three = h.values
     => [1, 2, 3] 
    2.4.1 :006 > @one
     => 1 
    2.4.1 :007 > @two
     => 2 
    2.4.1 :008 > @three
     => 3 
    2.4.1 :009 >
    

    具体应用

    您案例中的具体代码将变成:

    class Quote < ApplicationRecord 
      require 'watir'
      attr_accessor :lives, :benefit, :payment
    
      def scrape_quote
        rows = @browser.trs
        quote_rows = rows[1..8]
        scraped_values = {}
    
        quote_rows.each do |row|
          scraped_values[row.tds[0].text] = row.tds[1].text
        end
    
        @lives, @benefit, @payment = scraped_values.values
    
        puts scraped_values
      end
    end
    
        3
  •  0
  •   Aleksei Matiushkin    8 年前

    map 而不是 each 局部变量的预先声明。

    scraped_values = quote_rows.map do |row|
      [row.tds[0].text, row.tds[1].text]
    end.to_h
    
        4
  •  0
  •   Leo    8 年前

    scraped_values[0] 你需要这样的东西: scraped_values[scraped_values.keys[0]] ,因为scraped_值不是数组,0、1、2与任何其他缺失的键类似,所以哈希返回 nil

    推荐文章