【问题标题】:bad value in range argument error - regarding range construction in ruby范围参数错误中的错误值 - 关于 ruby​​ 中的范围构造
【发布时间】:2018-12-24 02:35:16
【问题描述】:

我写了以下sn-p。

def add_me(num)
    result = 0
    (1..num).each { |i| result += i}
    result
end
puts add_me(STDIN.gets)

我收到了一个参数错误list_sum.rb:6:in 'AddMe': bad value for range (ArgumentError) 第 # 行对应于我的编辑器中的第 # 行。

我还尝试了foo = (1..num).to_a 之类的东西。但仍然收到相同的错误。到底是怎么回事?红宝石版本 2.3.3。我错过了什么?我应该能够在范围内使用变量,不是吗?

【问题讨论】:

    标签: ruby range irb argument-error


    【解决方案1】:

    gets 返回一个字符串。您需要执行gets.to_i,以便将输入转换为您的数字范围的数字。现在,您正在尝试创建一个范围,其中开始是数字 1,结束是某个字符串,这会引发 ArgumentError

    顺便说一句,ruby 约定会告诉你你的函数应该命名为add_me。 Ruby 使用蛇形大小写,任何以大写字母开头的内容通常被假定为类或常量(常量全部大写)。

    【讨论】:

    • 现在可以使用了。但是如果输入是integer n,它不是定义的整数吗?(IE regex /d+/ 会选择 [0-9])
    • 不。 gets 总是返回一个字符串。 “5”和5之间有很大的区别。它可以帮助你尝试puts gets.class然后puts gets.to_i.class。确保两次输入完全相同的输入。您会看到第一个输出 String,第二个输出 IntegerFixnum,具体取决于您的 ruby​​ 版本(Fixnum 已被弃用以支持 Integer)。
    • 您可能想尝试的另一件事是暂时放弃获取,然后执行AddMe(5),然后执行AddMe('5')。您会发现第一个工作正常,第二个错误与之前的 ArgumentError 完全相同。希望这能帮助您了解更多情况。
    • 你说得对。 gets.class i 在 irb 中返回 String。以前从未尝试过。 Fixnum forgets.to_i.class 也许我应该从 v 0.9.6 更新 irb
    • 无需更新 IRb。这不会改变任何事情。 gets总是返回一个字符串。这就是它的作用。这就是文档所说的。猜猜gets 中的s 代表什么?
    猜你喜欢
    • 2018-12-14
    • 2014-05-10
    • 1970-01-01
    • 2018-07-07
    • 2012-01-24
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2016-09-08
    相关资源
    最近更新 更多