【问题标题】:no implicit conversion of String into Integer (TypeError) Why is it happening?没有将 String 隐式转换为 Integer (TypeError) 为什么会发生这种情况?
【发布时间】:2019-02-15 19:26:55
【问题描述】:

我正在编写一个读取 3 个整数的代码,第一个整数是低区间,第二个整数是高区间,第三个整数给出将显示的随机数的数量,我收到错误

没有将 String 隐式转换为 Integer (TypeError)

为什么?我认为是它的 Consant 类型导致了问题,但它改变了它,它仍然说同样的错误:

Interval00, Interval01, Interval02 = gets.chomp.split(&:to_i)

puts "#{Interval00} #{Interval01} #{Interval02}"

array = (Interval00...Interval01).to_a.shuffle.take(Interval02)

array.each do |output| puts output end

【问题讨论】:

  • 您使用的是哪个 Ruby 版本?将块传递给自 Ruby 2.6 以来存在的#split
  • .shuffle.take(Interval02) == .sample(Interval02)

标签: ruby


【解决方案1】:

在 Ruby v2.6 之前,String#split 不接受可选块。 v2.6 改变了。 v2.6 文档String#split 的最后一句指出,“如果给出了一个块,则使用每个拆分子字符串调用该块。”该文档还显示返回了接收者str

在下面的代码中,我在所有情况下都输入了字符串"1 2 3"。人们可能会认为区块的存在意味着

gets.split { |s| s.to_i }
  #=> "1 2 3\n"

相同
gets.split.map { |s| s.to_i }
  #=> [1, 2, 3]

但显然它不是,文档并没有声称它是。如果存在一个块,split返回它的接收者,这里是"1 2 3\n",块只执行计算,很像each

以下是如何使用块的简单示例。

a = []
gets.split { |s| a << s.to_i }
  #=> "1 2 3\n" 
a #=> [1, 2, 3] 

【讨论】:

    【解决方案2】:

    您需要将第一行更改为:

    Interval00, Interval01, Interval02 = gets.chomp.split.map(&:to_i)
    

    另外,您可能不想在变量名中使用大写的I

    错误是:

    no implicit conversion of String into Integer (TypeError)
    

    这表明你正在尝试做一些需要整数的事情,但你确实有一个字符串。如果您使用puts 检查Interval00,在您咀嚼之后,您会看到它是一个字符串,而不是一个整数。

    当您稍后尝试take 时,您传递的是字符串,而不是整数。你会注意到:

    [1, 2, 3].take("2")
    

    产生相同的错误。这不同于:

    [1, 2, 3].take(2)
    

    我建议的行是使用mapto_i 应用于您的拆分数据

    【讨论】:

    • 请解释为什么 OP 需要改变它。此外,可变大小写取决于编码人员自己的偏好,与此问题或答案无关。
    • @CarlMarkham 我们将不得不不同意这里的可变案例评论,但欢迎您进行编辑。前导大写字母表示它是常数。如果您正在接受用户输入,那么此时它并不是一个真正的常数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多