【问题标题】:Ruby: Why symbols change to strings when using puts instead of print?Ruby:为什么在使用 puts 而不是 print 时符号会变为字符串?
【发布时间】:2012-04-07 08:17:56
【问题描述】:

我不明白 print 和 puts 的行为? 我知道 print 不会换行,但 puts 可以。 但是为什么 print 的输出会在使用 puts 而不是 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

【问题讨论】:

  • print s 的行为更像puts s.inspectputsArray 将在新行上显示每个数组元素。至少我是这么认为的。
  • @Zabba p() 是一种将obj.inspect 写入标准输出的内核方法。不打印。
  • @Kit Ho:我没有看到 puts ant print 与符号一起工作的区别。可能你的意思是方法p()pastie.org/3743547

标签: ruby printing


【解决方案1】:

当你调用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 并在其后输出一个换行符。

【讨论】:

    【解决方案2】:

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

    也会输出同样的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2011-01-25
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2014-06-27
      相关资源
      最近更新 更多