2

私はRubyのチュートリアルを行っていて、コードが

puts 'start'
puts
puts 'end'

3行を出力しますが、次のコード

puts 'start'
puts []
puts 'end'

2つだけ出力します。述べられている理由は、 []はオブジェクトではない(編集: 「何も指していない」) ため、puts何もできないということですが、なぜ最初のケースにも当てはまらないのでしょうか?

putsこれを理解しようとしている公式ページを見つけようとしましたが、これは役に立ちませんでした.

4

5 に答える 5

8

述べられている理由は、 [] がオブジェクトではないということです

どこに記載?

putsは、配列に対して特別な処理を行います。配列を渡すと、各要素が新しい行に出力されます。ゼロ要素の配列を渡すと、ゼロ行が出力されます。

于 2012-12-11T06:36:05.623 に答える
2

引数なしの put には特別な動作があります。つまり、新しい行を出力します。それ以外の場合はすべて、すべての引数を配列として扱い、#to_s を使用してこれらの引数を文字列にマップし、各文字列を新しい行に出力します。そのため、呼び出し時に出力が得られませんputs []。出力に新しい行が必要な場合は、puts引数なしで呼び出すか (明白です)、次のように空の配列で splat 演算子を使用できますputs *[]

puts物事をよりよく理解するために、独自の実装を書くことができます。

  def my_puts(*args)
    STDOUT.write("args is #{args.inspect}\n")
    if args.empty?
      STDOUT.write("\n")
    else
      args.each { |arg| STDOUT.write("#{arg.to_s}\n") }
    end
  end


1.9.3p194 :039 > my_puts
args is []

 => 1 
1.9.3p194 :040 > my_puts []
args is [[]]
[]
 => [[]] 
1.9.3p194 :041 > my_puts *[]
args is []

 => 1 
1.9.3p194 :042 > my_puts 1,2,3
args is [1, 2, 3]
1
2
3
 => [1, 2, 3] 
1.9.3p194 :043 > my_puts [1,2,3]
args is [[1, 2, 3]]
[1, 2, 3]
 => [[1, 2, 3]] 
1.9.3p194 :044 > my_puts *[1,2,3]
args is [1, 2, 3]
1
2
3
 => [1, 2, 3] 
于 2012-12-11T07:32:13.683 に答える
2

puts配列を使用すると、要素ごとに 1 行が出力されます。要素も線もありません。

編集:私が今言ったことはあなたのリンクに記載されています:

配列引数で呼び出された場合、各要素を新しい行に書き込みます。

于 2012-12-11T06:35:30.420 に答える
2
puts arr

のようなものです

arr.each { |e| puts e }

あなたは自分でこのようなことをすることができます:

def p(s)
  if s.respond_to? 'each'
    s.each { |e| p e }
  else
    puts s
  end
end

p 'hello' # prints line with 'hello'
p [] # prints nothing
p [1, 2] # prints 2 lines with 1 and 2
于 2012-12-11T06:37:27.233 に答える
2

あなたが共有したリンクには、次のように記載されています。

配列引数で呼び出された場合、各要素を新しい行に書き込みます。

puts []

putsつまり、空の配列で呼び出しています。つまり、印刷する要素はありません。それが起こったことです。

于 2012-12-11T06:38:27.337 に答える