我在方法中调用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
的输出似乎只是自己行上的每个数字?我是否需要在函数中显式创建数组,然后明确地将拆分数推入其中?
答案 0 :(得分:7)
当你在一个数组上调用puts
时,它会在每个元素之后用换行符分别输出数组的每个元素。要确认您的to_s
方法正在将数字转换为字符串,请尝试使用print
代替puts
。
对于输出的nil
,这是函数的返回值。除非有明确的return
,否则函数的返回值将是对最后一行的求值,在您的情况下为puts number
。 puts 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
。
祝你好运