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

时间:2017-07-27 15:37:01

标签: ruby instance-variables

当我调用Quote时,在我的Quote#scrape_quote实例中尝试设置和/或访问这些变量时,我似乎遇到了一些基本错误。我可以看到这些值被抓取并保存到scraped_values哈希就好了,当我打电话给quote.lives时,我无法访问这些变量。我得到nil

我在这里弄错了什么?

quote.rb

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 个答案:

答案 0 :(得分:3)

scraped_values是一个哈希而不是一个数组。您正尝试访问它,就像它是一个数组一样。

使用h = {a:1,b:2} h[:a] => 1 中的任何内容来引用哈希:

{{1}}

答案 1 :(得分:2)

一般情况

如果您只想将哈希的值按顺序分配给成员变量,则可以使用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

答案 2 :(得分:0)

构建哈希的惯用方法是使用map代替each不使用局部变量的前期声明。

scraped_values = quote_rows.map do |row|
  [row.tds[0].text, row.tds[1].text]
end.to_h

答案 3 :(得分:0)

而不是scraped_values[0]你需要这样的东西:scraped_values[scraped_values.keys[0]],因为scraped_values不是数组而0,1,2就像任何其他缺失键一样,所以hash返回{{1} }。