我无法识别的错误

时间:2013-12-07 20:21:37

标签: ruby

我之前运行了这段代码:

require "awesome_print"
require "rexml/document"
require "debugger"

include REXML

class Scrapper
  attr_reader :data

  def initialize
    file = File.new("./cia-1996.xml")
    @data = REXML::Document.new(file)
  end

  def get_country_inflation
    inflation_hash = {}
    XPath.match( data, "//country").map { |element| 
      inflation_hash[element.attributes["name"]] = element.attributes["inflation"].to_i}
      nested_array = inflation_hash.to_a
      sorted_array = nested_array.sort_by {|country, inflation_value| inflation_value}.reverse
      puts "The countries with the highest inflation indexes in 1996 were:"
      first_five = sorted_array.first(5)
      first_five.each do |item|
        puts "#{item[0]}, with an inflation index of #{item[1]}"
      end
    end
  end
end


sample = Scrapper.new
sample.get_country_inflation

进行一些编辑后,我现在收到错误消息

  

economics_challenge.rb:36:语法错误,意外的keyword_end,期待输入结束

你能否指点一下错误/错字的位置(现在已经主演了一段时间,并会欣赏新眼睛的反馈)。

非常感谢你!

编辑: 所以我提出了更改建议但是我收到了更多错误消息:

economics_challenge.rb:26: syntax error, unexpected tSTRING_DEND, expecting keyword_end
economics_challenge.rb:29: syntax error, unexpected tSTRING_DEND, expecting '}'
...flation_value| inflation_value}.reverse
...                               ^
economics_challenge.rb:35: syntax error, unexpected keyword_end, expecting '}'
economics_challenge.rb:46: syntax error, unexpected end-of-input, expecting '}'

第26行是指下面代码段中的第2行:代码段(我认为这是原始问题所在的位置):

XPath.match( data, "//country").map do |element|
      inflation_hash[element.attributes["name"]] = element.attributes["inflation"].to_i}
end

第29行是:

sorted_array = nested_array.sort_by {|country, inflation_value| inflation_value}.reverse

我将尝试通过在排序数组上调用reverse并将其保存到变量来修复29中的错误。

第35行是结束语句,没有第46行。

任何提示?

谢谢!

第二编辑: 哇!我无法相信我没有意识到我没有结束很多事情。从现在开始,我将坚持使用do and结束语法。

非常感谢你们帮我这么多......真的很感激!

2 个答案:

答案 0 :(得分:2)

问题是您还有一个end

正如@david-grayson所述,如果你的缩进是正确的,你可能已经发现了它。

这当然是给出了你在这里提出的代码。虽然错误消息与找到的问题匹配,但可能并非如此。

以下是包含缩进,某些样式更改以及没有语法错误的代码:

require 'awesome_print'
require 'rexml/document'
require 'debugger'

include REXML

class Scrapper
  attr_reader :data

  def initialize
    file = File.new('./cia-1996.xml')
    @data = REXML::Document.new(file)
  end

  def get_country_inflation
    inflation_hash = {}
    XPath.match(data, '//country').map do |element|
      inflation_hash[element.attributes['name']] = element.attributes['inflation'].to_i
    end
    nested_array = inflation_hash.to_a
    sorted_array = nested_array.sort_by do |country, inflation_value|
      inflation_value
    end.reverse
    puts 'The countries with the highest inflation indexes in 1996 were:'
    first_five = sorted_array.first(5)
    first_five.each do |item|
      puts "#{item[0]}, with an inflation index of #{item[1]}"
    end
  end
end

sample = Scrapper.new
sample.get_country_inflation

答案 1 :(得分:1)

你的缩进从这里开始搞砸了:

XPath.match( data, "//country").map { |element| 
  inflation_hash[element.attributes["name"]] = element.attributes["inflation"].to_i}
  nested_array = inflation_hash.to_a

该摘录的最后一行应该缩进一个级别,因为传递给“map”的块在第二行被右括号终止。

尝试修复它及其后的所有内容。

此外,还有一个提示:始终使用doend编写多行块,并将end放在自己的行上。然后你可能会:

XPath.match( data, "//country").map do |element| 
  inflation_hash[element.attributes["name"]] = element.attributes["inflation"].to_i
end
nested_array = inflation_hash.to_a