Ruby中Sprintf与Puts的差异:为何sprintf无输出而puts有?(Ruby2.5.0)
为什么Ruby里函数内调用sprintf无输出,而puts可以?
其实这完全是因为两个方法的职责完全不同,搞清楚它们的定位就明白啦~
先说说puts的作用
puts 从设计上就是一个输出方法,它的核心任务就是把内容输出到标准输出(stdout)。不管你给它传什么参数,它都会先把参数转换成字符串,然后打印到控制台,还会自动在末尾加个换行符。比如:
def test_puts puts "Hello World" # 直接输出到控制台 end test_puts
这时候你能看到输出,完全是因为puts本身就负责“输出”这个动作。
再看sprintf的本质
sprintf 是个字符串格式化工具,它的唯一作用是:根据你提供的格式模板和数据,生成并返回一个格式化好的字符串——它根本不负责输出!
也就是说,当你调用 sprintf("Hello %s", "Ruby") 时,它只是在内存里生成了 "Hello Ruby" 这个字符串,然后把这个字符串返回给你。但如果你没有把这个返回值传给输出方法(比如puts、print),也没有把它赋值给变量保存,那这个字符串就会被Ruby的垃圾回收机制回收掉,自然不会在控制台看到任何输出。比如:
def test_sprintf sprintf("Hello %s", "Ruby") # 只生成字符串,不输出,所以看不到结果 end test_sprintf
如果想要看到sprintf的结果,你需要把它的返回值交给输出方法处理:
def test_sprintf_output puts sprintf("Hello %s", "Ruby") # 用puts输出sprintf生成的字符串 end test_sprintf_output
这时候就能看到控制台输出了。
额外补充:printf方法
如果你想一步完成“格式化+输出”,Ruby还有个printf方法,它相当于把sprintf的格式化逻辑和输出动作结合在了一起,不过它不会自动加换行,需要手动加\n:
def test_printf printf("Hello %s\n", "Ruby") # 直接格式化并输出 end test_printf
总结一下
puts:核心是输出到stdout,只要调用就会打印内容sprintf:核心是生成格式化字符串,只返回结果,不做输出- 要让sprintf的结果显示出来,必须把它的返回值传给输出方法,或者用printf直接完成格式化+输出
内容的提问来源于stack exchange,提问作者Aaron Thomas
相关产品推荐
相关产品推荐

