我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似乎只是每个数字在它自己的行?我是否需要在函数中显式创建数组,然后显式地将拆分数推入其中?
当你调用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']
Run Code Online (Sandbox Code Playgroud)
我怀疑你实际上num.to_s.split(//)在线后看到了输出,而不是puts number线.
您的函数正在调用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)