Ruby:为什么在使用puts而不是print时符号会更改为字符串?

时间:2012-04-07 08:17:56

标签: ruby printing

我不明白打印和放置的行为? 我知道印刷品不会成新线但是可以。 但是当使用puts而不是print时,为什么print的输出会从符号变为字符串?

`$ ruby​​ -e'print Kernel.private_instance_methods(false)'

[:initialize_copy, :remove_instance_variable, :sprintf, :format, :Integer, :Float, :String, :Array, :warn, :raise, :fail, :global_variables, :__method__, :__callee__, :eval, :local_variables, :iterator?, :block_given?, :catch, :throw, :loop, :caller, :trace_var`

$ ruby​​ -e'put Kernel.private_instance_methods(false)'

initialize_copy
remove_instance_variable
sprintf
format
Integer
Float
String
Array
warn
raise
fail
global_variables
__method__
__callee__
eval
local_variables

2 个答案:

答案 0 :(得分:4)

当你致电puts时,真正被称为rb_io_puts C函数的内容基本上是这样的:

  • 如果没有参数,请输出换行符。
  • 对于每个参数,检查它是否为字符串类型(Ruby C语言中为T_STRING),如果是,请使用它调用rb_io_write。此外,如果字符串长度为零或未在换行符中完成,请添加\n
  • 如果参数是数组,则递归调用io_puts_ary
  • 在任何其他情况下,请在参数上调用rb_obj_as_string,该参数基本上是to_s的低级等效值。

因此,当您puts [:a, :b, :c]时,您将遇到第三个案例,io_puts_ary将接管。长话短说这将做与我上面描述的类似的事情,并将在每个元素上调用rb_obj_as_string并输出它后跟换行符。

答案 1 :(得分:0)

print函数将调用数组的to_s函数, 数组的to_s函数是inspect函数的别名。

这可以在ruby的array.c代码中找到。

rb_define_alias(rb_cArray,  "to_s", "inspect");

因此:

array = Kernel.private_instance_methods(false)
$stout.write(array.to_s)

也会输出相同的结果。