Ruby:为什么在使用puts而不是print时符号会变成字符串?
我不明白打印和放置的行为? 我知道print不会生产新产品,但它可以生产。 但为什么在使用puts而不是print时,print的输出会从符号变为字符串 `$ruby-e'打印内核.private_实例_方法(false)' $ruby-e'put Kernel.private_instance_methods(false)'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
当您调用
put
时,真正被调用的是rb\u io\u put
C函数,其基本工作原理如下:
- 如果没有参数,则输出换行符
- 对于每个参数,检查它是否为string类型(
,用Ruby C语言),如果是,则使用它调用T_string
。此外,如果字符串长度为零或没有换行,请添加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类型(
,用Ruby C语言),如果是,则使用它调用T_string
。此外,如果字符串长度为零或没有换行,请添加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一个数组
将在新行上显示每个数组元素。或者我相信是这样的。@Zabbap()
是一个内核方法,它将对象的obj.inspect
写入标准输出。不打印。@Kit Ho:我看不出打印和符号打印之间的区别。您的意思可能是方法p()
<代码>打印s的行为更像是放置s.inspect
<代码>放置ing一个数组
将在新行上显示每个数组元素。或者我相信是这样的。@Zabbap()
是一个内核方法,它将对象的obj.inspect
写入标准输出。不打印。@Kit Ho:我看不出打印和符号打印之间的区别。您的意思可能是方法p()
?