【问题标题】:`to_s` isn't converting an integer to a string`to_s` 没有将整数转换为字符串
【发布时间】:2023-03-19 22:11:01
【问题描述】:

我在一个方法中调用to_s

$  def my_function(num)
$    number = num.to_s.split(//)
$    puts number
$  end

$  my_function(233)
2
3
3
# => nil

在我看来,就像在函数中一样,没有创建数组,因为输出是nil。为什么在方法内部调用to_s.split(//)时没有创建字符串数组?

另外,为什么puts number 的输出似乎只是单独一行的每个数字?我是否需要在函数中显式创建数组,然后显式将拆分数推入其中?

【问题讨论】:

    标签: ruby puts


    【解决方案1】:

    当您在数组上调用puts 时,它会分别输出数组的每个元素,并在每个元素后添加一个换行符。要确认您的 to_s 方法正在将数字转换为字符串,请尝试使用 print 而不是 puts

    至于输出的nil,就是你的函数的返回值。除非有明确的return,否则函数的返回值将是对最后一行的评估,在您的情况下为:puts numberputs number的返回值为nil;打印number 的值是副作用,而不是返回值。

    我很好奇为什么输出在你的第一行代码中确实是一个数组(不在函数内):

    $  num = 233
    $  number = num.to_s.split(//)
    $  puts number
    => ['2', '3', '3']
    

    我怀疑您实际上在num.to_s.split(//) 行之后看到了该输出,而不是puts number 行。

    【讨论】:

      【解决方案2】:

      您的函数正在调用puts number。那将显示它,而不是返回它。 puts 返回 nil,这就是您对 my_function(233) 的调用返回 nil 的原因。输出是每行上的单个数字的原因是因为这是 puts 在将数组传递给它时所做的事情。每行一个元素。

      试试这个代码:

      puts [1,2,3]
      
      puts '=' * 40
      
      def my_function(num)
        num.to_s.split(//)
      end
      
      x =  my_function(233)
      
      p x
      

      运行时输出为:

      1
      2
      3
      ========================================
      ["2", "3", "3"]
      

      主要区别在于my_function 不再显示任何输出。它只是返回结果。重要的是要记住,ruby 方法将返回最后一个评估的语句作为结果。也就是说上面的方法和这个是一样的:

      def my_function(num)
        return num.to_s.split(//)
      end
      

      【讨论】:

      • 谢谢。这很有帮助。我依赖于隐式回报,没有意识到我正在用看跌期权覆盖它们。这样就解决了。
      【解决方案3】:

      您在第一个 sn-p 中看到的数组是对 split 函数求值的结果。在函数之外试试这个:puts [1,2,3],你会发现结果没有变化。

      如果您希望它以可爱的方式打印,请使用print

      最好的问候

      【讨论】: