0

I don't understand the behavior of print and puts? I know print would not make a new line but puts can. but why the output of print will change from symbol to string when using puts instead of 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 'puts 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
4

2 回答 2

3

当你调用puts时,真正被调用的是rb_io_putsC 函数,它的工作原理基本上是这样的:

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

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

于 2012-04-07T09:15:20.547 回答
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)

也会输出相同的结果。

于 2012-04-07T11:58:19.767 回答