1) 3,2,5,8 はわかりましたが、配列形式 [3,2,5,8] で表示されず、一度に 1 つの int で表示されるのはなぜですか。
これは仕組みによるものputs
です。配列を見ると、#to_s
各要素の
puts [1,2,3]
# >> 1
# >> 2
# >> 3
配列のように見せたい場合は、印刷する前に検査する必要があります
puts [1,2,3].inspect
# >> [1, 2, 3]
これの省略形もあります。p
p [1,2,3]
# >> [1, 2, 3]
2) また、wheels.collect ブロックでは、出力を入れる前に「test」を 2 回出力します。「test」値「test」値ではないはずです。
値を出力するのは の戻り値に対する puts ステートメントだけなdiameters
ので、値が収集されるまで出力されません。各テストの後に印刷したい場合は、おそらく次のようにする必要があります
def diameters
wheels.collect do |wheel|
puts "test"
p wheel.rim + (wheel.tire*2)
end
end
どちらが印刷されますか:
test
3
test
2
test
1
test
0
3) また、答え 3,2,1,0 は意味がありません。@wheels を設定すると、wheels は 4 要素ではなく 2 要素の配列のコレクションであってはなりませんか?
ここで言っていることに基づいて、データが意図した形式ではないと思います。を渡していますが、これは、 を渡すか、値のすべてのペアにマップ[3,2,5,8]
することを意味します。[[3,2],[5,8]]
def wheelify(data)
data.each_slice(2).collect do |cell|
Wheel.new(cell[0], cell[1])
end
end
あなたが考えていることをしていない理由は、これらのいずれかを行わないと、cell
変数が実際には単なる数値になるためです。数値には括弧メソッドが定義されているため、この場合は機能します。ただし、かっこメソッドは、その位置のビット (基数 2) に応じて、1 または 0 を返すだけです。
five = 5
five.to_s(2) # => "101"
five[2] # => 1
five[1] # => 0
five[0] # => 1
したがって、3の場合はwheel.rim + (wheel.tire*2)
、
cell = 3
cell.to_s(2) # => "11"
rim = cell[0] # => 1
tire = cell[1] # => 1
rim + tire * 2 # => 3
そして2の場合:
cell = 2
cell.to_s(2) # => "10"
rim = cell[0] # => 0
tire = cell[1] # => 1
rim + tire * 2 # => 2
そして5:
cell = 5
cell.to_s(2) # => "101"
rim = cell[0] # => 1
tire = cell[1] # => 0
rim + tire * 2 # => 1
そして8:
cell = 8
cell.to_s(2) # => "1000"
rim = cell[0] # => 0
tire = cell[1] # => 0
rim + tire * 2 # => 0
これが、表示される最後の 4 桁を説明する をdiameters
返す理由です。[3, 2, 1, 0]