我不明白打印和放置的行为? 我知道印刷品不会成新线但是可以。 但是当使用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
答案 0 :(得分:4)
当你致电puts
时,真正被称为rb_io_puts
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)
也会输出相同的结果。