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

10

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

3个回答

12
当你在一个数组上调用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这一行。


5
你的函数调用了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

谢谢。非常有帮助。我一直依赖隐式返回,没有意识到我用 puts 覆盖了它们。问题解决了。 - Alec Wilson

3

你在第一个代码片段中看到的数组是split函数评估的结果。尝试在函数之外执行以下内容:puts [1,2,3],你会发现结果没有变化。

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

最好的祝福


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接