【问题标题】:undefined method `split' for nil:NilClass (NoMethodError) for an arraynil 的未定义方法“split”:数组的 NilClass (NoMethodError)
【发布时间】:2014-05-20 10:37:04
【问题描述】:

我正在尝试读取包含一些数字的文件。然后我想将它们转换为整数。当我像下面这样尝试时,没关系。

input = IO.readlines(filename)
size = input[0].split(/\s/).map(&:to_i)

但是,当我像下面这样尝试时,它给了我这个错误。

input = IO.readlines(filename)
lnth = input.length
i=0
while i<=lnth
  size = input[i].split(/\s/).map(&:to_i)
  i=i+1
end

nil:NilClass (NoMethodError) 的未定义方法 `split'

我现在如何解决这个错误?

【问题讨论】:

  • 您最终得到i == input.length,但input[input.length] 不存在(它是nil),因此出现错误。试试while i &lt; lnth,虽然你可以做input.each。
  • @DaniëlKnippers 完美答案(也是第一个),为什么要评论?发布作为答案。
  • @DaniëlKnippers 非常感谢。有用。 :D
  • @ArupRakshit 我想你是对的,我通常将 cmets 发布到诸如索引越界之类的小错误,但我想我应该回答:) 获得声誉感觉有点傻将&lt;= 更改为&lt; 并进行解释。
  • @DaniëlKnippers 它的开发者网站,所以值得获得一些代表,同时你正在清除其他开发者的痛苦.. 即使它是最小的。因为有时要修复这些错误需要更多时间。所以您节省了时间...

标签: ruby file-io


【解决方案1】:

显然while i&lt;lnth 不是&lt;=:

while i<lnth
  size = input[i].split(/\s/).map(&:to_i)
  i=i+1
end

但最好使用:

size = line.split(/\s/).map(&:to_i)

【讨论】:

    【解决方案2】:

    我想知道这应该做什么?

    size = line.split(/\s/).map(&:to_i)
    

    它将分割一个像“321 123 432”这样的字符串,并返回一个像[321,123,432]这样的数组。 此外,变量size 在每一轮都会再次初始化。

    忽略这一点,这里有一个更像 Ruby 的版本:

    File.readlines(filename).each do |line|
      size = line.split(/\s/).map(&:to_i)
    end
    

    在 Ruby 中,您通常不会使用 for i in item_count .. 或 while i&lt;item_count 之类的东西,因为我们有 .each 之类的枚举器。

    【讨论】:

    • 非常感谢您的建议。我是红宝石新手。所以它会对我有很大帮助。我会听从你的建议。
    【解决方案3】:

    应该这样做:

    def nil.split *args
      nil # splitting of nil, in any imaginable way, can only result again in nil
    end
    

    【讨论】:

      【解决方案4】:

      在拆分之前将其转换为字符串,即input[i].to_s.split(/\s/)

      可能是input[i]是nil,所以转成字符串

      ref

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-01
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多