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

Ruby:为什么在使用puts而不是print时符号会变成字符串?,ruby,printing,Ruby,Printing,我不明白打印和放置的行为? 我知道print不会生产新产品,但它可以生产。 但为什么在使用puts而不是print时,print的输出会从符号变为字符串 `$ruby-e'打印内核.private_实例_方法(false)' $ruby-e'put Kernel.private_instance_methods(false)' 当您调用put时,真正被调用的是rb\u io\u putC函数,其基本工作原理如下: 如果没有参数,则输出换行符 对于每个参数,检查它是否为string类型(T_st

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

`$ruby-e'打印内核.private_实例_方法(false)'

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


当您调用
put
时,真正被调用的是
rb\u io\u put
C函数,其基本工作原理如下:

  • 如果没有参数,则输出换行符
  • 对于每个参数,检查它是否为string类型(
    T_string
    ,用Ruby C语言),如果是,则使用它调用
    rb_io_write
    。此外,如果字符串长度为零或没有换行,请添加
    \n
  • 如果参数是数组,则递归调用
    io\u puts\u ari
  • 在任何其他情况下,对参数调用
    rb\u obj\u as\u string
    ,这基本上是
    to\u s
    的低级等价物

因此,当您
put[:a,:b,:c]
时,您将遇到第三种情况,
io\u put\u ary
将接管。长话短说,这将做一些类似于我上面描述的事情,在每个元素上调用
rb_obj_as_string
,然后输出一个新行。

当你调用
put
时,真正被调用的是
rb_io_put
C函数,它基本上是这样工作的:

  • 如果没有参数,则输出换行符
  • 对于每个参数,检查它是否为string类型(
    T_string
    ,用Ruby C语言),如果是,则使用它调用
    rb_io_write
    。此外,如果字符串长度为零或没有换行,请添加
    \n
  • 如果参数是数组,则递归调用
    io\u puts\u ari
  • 在任何其他情况下,对参数调用
    rb\u obj\u as\u string
    ,这基本上是
    to\u s
    的低级等价物

因此,当您
put[:a,:b,:c]
时,您将遇到第三种情况,
io\u put\u ary
将接管。长话短说,这将执行与我上面描述的类似的操作,并将在每个元素上调用
rb_obj_as_string
,然后输出新行。

打印函数将调用数组的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)

也将输出相同的结果。

打印函数将调用数组的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)

也将输出相同的结果。

print s
的行为更像
put s.inspect
<代码>放置ing一个
数组
将在新行上显示每个数组元素。或者我相信是这样的。@Zabba
p()
是一个内核方法,它将对象的
obj.inspect
写入标准输出。不打印。@Kit Ho:我看不出打印和符号打印之间的区别。您的意思可能是方法
p()
<代码>打印s的行为更像是
放置s.inspect
<代码>放置ing一个
数组
将在新行上显示每个数组元素。或者我相信是这样的。@Zabba
p()
是一个内核方法,它将对象的
obj.inspect
写入标准输出。不打印。@Kit Ho:我看不出打印和符号打印之间的区别。您的意思可能是方法
p()