【问题标题】:variable addition within index returns nil in ruby索引中的变量加法在 ruby​​ 中返回 nil
【发布时间】:2015-09-29 18:51:11
【问题描述】:

当我尝试使用条件迭代字符串中的索引时,我在练习中遇到过这个错误两次。当我将其与个别案例分开时,逻辑似乎有效,但 Ruby 不喜欢它的表达方式。

def NumberAddition(str)

  def is_num(num)
    (0..9).include? num.to_i
  end

  i = 0
  sum = 0

  while i < str.length
    if is_num(str[i])
      if !is_num(str[i+1])
        sum += str[i].to_i
          else
        mult = str[i]
        n = 1
        while is_num(str[i+n])
          mult << str[i+n]
          n += 1
        end
        sum += mult.to_i
      end
    end
    i += 1
  end

  sum
end

NumberAddition("75Number9")

抛出此错误:

no implicit conversion of nil into String
(repl):18:in `NumberAddition'

换行:

mult << str[i+n]

显然不是为 str[i+n] 返回字符串“5”, 其中 i=0 和 n=1,它找到 nil。有没有办法用我的方法来表达这一点,还是我需要重新设计整个循环?

【问题讨论】:

  • 你的代码太复杂了。请阅读本文,了解如何创建最小、完整和可验证的示例:stackoverflow.com/help/mcve
  • 您的代码非常不像Ruby。我猜你来自一种大量使用索引的语言。鲁比没有。相反,它主要使用枚举器和块。你必须打破这种习惯才能有效地使用 Ruby。一旦你修复了你的代码,我建议你将它发布到Code Review。在那里你会得到关于如何改进它的好建议。

标签: ruby


【解决方案1】:

您的is_num 函数没有考虑到nil.to_i0。这就是您收到错误的原因,因为您试图将 nil 附加到字符串。你需要使用这样的东西:

def is_num(num)
  # convert string to integer and back to string should be equal to string itself
  num.to_i.to_s == num 
end

或者,如果您想确保连接字符串,只需将参数转换为字符串

mult << str[i+n].to_s # nil gets converted to an empty string

【讨论】:

  • 最好将方法命名为is_num?。也可以写成:def is_num?(num); !!Integer(num) rescue; end。如果num 可以转换为整数,Integer(num) 将返回该整数,即“真实”;否则rescue 返回nil!! 将一个真值转换为true,将一个falsy 值转换为false
猜你喜欢
  • 2016-05-01
  • 1970-01-01
  • 2014-09-10
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多