0

印刷と書き込みの動作がわかりませんか?私は、印刷が新しい行を作成しないことを知っていますが、置くことができます。しかし、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'は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_STRINGRuby Cの用語で)かどうかを確認し、そうである場合rb_io_writeはそれを使用して呼び出します。また、文字列の長さがゼロの場合、または改行で終了しなかった場合は、を追加し\nます。
  • 引数が配列の場合は、再帰的に呼び出しますio_puts_ary
  • それ以外の場合は、引数を呼び出しrb_obj_as_stringます。これは基本的に、の低レベルの同等物ですto_s

したがって、あなたがputs [:a, :b, :c]、あなたが3番目のケースをヒットし、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 に答える