我得到了一个“未定义的方法'新'...​​(每次更改的数字)”

时间:2016-11-25 23:51:58

标签: ruby

我使用单一方法制作了一个简单的程序,我正在尝试测试它,但我一直得到这个奇怪的错误,我不知道它为什么会一直发生。 这是我写的唯一方法的代码:

(Num a, Ord a)

然后这就是我调用方法的内容(在同一个程序中)。

    def make_database(lines)
      i = 0
      foods = hash.new()
      while i < lines.length do
        lines[i] = lines[i].chomp()
        words = lines[i].split(',')
        if(words[1].casecmp("b") == 0)
          foods[words[0]] = words[3]
        end
      end
    return foods
    end

我感到非常困惑,特别是因为它为每个“未定义方法'新'(随机数)”提供了一个不同的随机数。

1 个答案:

答案 0 :(得分:2)

这是一个简单的错误。 hash在当前对象上调用一个方法,该方法返回Hash结构用于索引条目的数字,其中Hash是您可能想要的哈希类:

foods = Hash.new()

或者更简洁:

foods = { }

使用{ }代替Hash.new是理想的,除非您需要指定默认值之类的内容,例如:

Hash.new(0)

默认情况下,所有值都初始化为0。这在创建简单计数器时非常有用。

Ruby类由大写字母标识,以避免混淆这样的情况。一旦你习惯了语法,你就可以更容易地发现错误。

请注意,在编写Ruby代码时,您几乎总是会在空参数列表中省略大括号/括号。这是x()简称为x。这使代码更具可读性,尤其是在链接时,例如x.y.z而不是x().y().z()

需要注意的其他事项包括能够使用readlines读取所有行,而不是您手动编写它的地方。尝试:

make_database($stdin.readlines.map(&:chomp))

对代码进行更积极的重构如下所示:

def make_database(lines)
  # Define a Hash based on key/value pairs in an Array...
  Hash[
    # ...where these pairs are based on the input lines...
    lines.map do |line|
      # ...which have comma-separated components.
      line.split(',')
    end.reject do |key, flag, _, value|
      # Pick out only those that have the right flag.
      flag.downcase == 'b'
    end.map do |key, flag, _, value|
      # Convert to a simple key/value pair array
      [ key, value ]
    end
  ]
end

这可能有点难以理解,但是一旦你把一系列简单的操作链接在一起,你的Ruby代码就会更灵活,更容易阅读。