8

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看起来每个数字的输出都在它自己的一行上?我是否需要在函数内显式创建数组,然后显式将拆分数推入其中?

4

3 回答 3

10

当你调用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行。

于 2015-02-26T01:07:00.057 回答
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
于 2015-02-26T01:02:23.710 回答
3

您在第一个片段中看到的数组是 split 函数的评估结果。在函数 : 之外试试这个puts [1,2,3],你会发现结果没有变化。

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

此致

于 2015-02-26T01:03:02.470 回答