`to_s`不是将整数转换为字符串

时间:2015-02-26 00:47:29

标签: ruby puts

我在方法中调用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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

您的函数正在调用puts number。那将显示它,而不是返回它。 puts返回nil,这就是您对my_function(233)的回复为零的原因。输出在每一行上是单个数字的原因是因为这是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

答案 2 :(得分:3)

您在第一个代码段中看到的数组是分割函数评估的结果。在函数外部尝试此操作:puts [1,2,3],您将看到结果没有变化。

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

祝你好运