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

Ale*_*son 7 ruby puts

to_s在一个方法中调用:

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

$  my_function(233)
2
3
3
# => nil
Run Code Online (Sandbox Code Playgroud)

它看起来像在函数中,因为输出没有创建数组nil.为什么to_s.split(//)在方法内部调用时不会创建字符串数组?

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

dwe*_*zel 8

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

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

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

$  num = 233
$  number = num.to_s.split(//)
$  puts number
=> ['2', '3', '3']
Run Code Online (Sandbox Code Playgroud)

我怀疑你实际上num.to_s.split(//)在线后看到了输出,而不是puts number线.


Phi*_*rom 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
Run Code Online (Sandbox Code Playgroud)

运行时输出为:

1
2
3
========================================
["2", "3", "3"]
Run Code Online (Sandbox Code Playgroud)

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

def my_function(num)
  return num.to_s.split(//)
end
Run Code Online (Sandbox Code Playgroud)