あなたのコードを実行するときは、以下を得る。さんは何が起こっているかを詳しく見てみましょう。
high_capacities_homes = homes.select do |hm|
hm.capacity >= 4
puts high_capacities_homes
end
=> []
空の配列が返されますが、それらの空白行はすべてなぜですか?コードがの各要素に対してputs nil
を実行しているからです。 Rubyは
high_capacities_homes = <anything>
を見たとき、彼女が最初に行うことは、ローカル変数high_capacities_homes
を作成し、値を代入nil
ある
high_capacities_homes = homes.select do |hm|
hm.capacity >= 4
puts "high_capacities_homes is nil: #{high_capacities_homes.nil?}"
end
high_capacities_homes is nil: true
high_capacities_homes is nil: true
high_capacities_homes is nil: true
high_capacities_homes is nil: true
high_capacities_homes is nil: true
=> []
:これを考えてみましょう。 select
が終了した後にのみ、homes
の列挙はhigh_capacities_homes
であり、返される値はselect
のブロック、つまり[]
となります。
もう1つ問題があります。あなたのメソッドの最初の行、
hm.capacity >= 4
はtrue
またはfalse
を返しますが、その戻り値が作用されていません。それはちょうどにあなたのコードと同等を作り、再び見られないことを決して、宇宙に出て撮影されていますかのようです:プット以来
high_capacities_homes = homes.select do |hm|
puts high_capacities_homes
end
がnil
を返します(それは印刷が何でも印刷後)、配列high_capacities_homes
を構築するために、
homes
のない要素が選択されなかった理由である
high_capacities_homes = homes.select do |hm|
nil
end
:あなたのコードは、になります。
hm
のhomes
の配列を作成したい場合は、hm.capacity >= 4
(これらのインスタンスの情報も印刷します)ですか?その場合は、まずhomes
の要素を選択してください:。
selected_homes = homes.select { |hm| hm.capacity >= 4 }
# => [#<Home:0x007ff81981e138 @name="Fernando's place", @city="Seville",
# @capacity=5, @price=47>,
# #<Home:0x007ff81981dda0 @name="Ariel's place", @city="San Juan",
# @capacity=4, @price=49>]
Array#selectがselect
のブロックがtrue
を返すhomes
のhm
れるすべての要素を保持することに留意されたいです。
今、何を印刷しますか?それがselected_homes
の各要素のインスタンス変数の値であれば、次のように(例として)行うことができます。
selected_homes.each { |hm|
puts "#{hm.name} in #{hm.city} has capacity #{hm.capacity} and price $#{hm.price}" }
プリント
Fernando's place in Seville has capacity 5 and price $47
Ariel's place in San Juan has capacity 4 and price $49
1あなたは、もちろん、代わりにselected_homes = homes.reject { |hm| hm.capacity < 4 }
を書くことができます。
'homes.select {| a | a.capacity> = 4} ' –
' puts'は何も 'nil'を返します。単純に 'puts'で行を削除し、' high_capacities_homes'の前に 'puts'を挿入してください。 –
sidenote:初期化中に簡単にエラーが発生することがあります。たとえば、引数が間違った順序で入れられているとします。おそらく、ハッシュを使用し、それに応じてinitializeメソッドを再定義するほうがよいでしょう。 –