`to_s` 没有将整数转换为字符串

`to_s` isn't converting an integer to a string

我在方法中调用 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 的输出看起来只是每个数字单独一行?我是否需要在函数中显式创建数组,然后显式将拆分后的数字压入其中?

您的函数正在调用 puts number。那将显示它,而不是 return 它。 puts returns nil 这就是为什么您对 my_function(233) 的调用是 returning 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 不再显示任何输出。它只是 return 的结果。重要的是要记住 ruby 方法将 return 最后计算的语句作为结果。也就是说上面的方法和这个是一样的:

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

您在第一个代码段中看到的数组是拆分函数的计算结果。在函数之外尝试此操作: puts [1,2,3] ,您会发现结果没有变化。

如果你想让它以可爱的方式打印出来,请使用print

此致

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

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

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

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

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