2016-10-17 13 views
0

を取得するために選択の使用:選択配列ルビー - 私はこの上の容量> = 4を取得するために選択を使用しようとしている> = 4容量

class Home 
    attr_reader(:name, :city, :capacity, :price) 

    def initialize(name, city, capacity, price) 
    @name = name 
    @city = city 
    @capacity = capacity 
    @price = price 
    end 
end 

homes = [ 
    Home.new("Nizar's place", "San Juan", 2, 42), 
    Home.new("Fernando's place", "Seville", 5, 47), 
    Home.new("Josh's place", "Pittsburgh", 3, 41), 
    Home.new("Gonzalo's place", "Málaga", 2, 45), 
    Home.new("Ariel's place", "San Juan", 4, 49) 
] 

私が試した:

high_capacities_homes = homes.select do |hm| 
    hm.capacity >= 4 
    puts high_capacities_homes 
end 

をせずに任意の成功とアイデアのイム、誰かが助けてくれる? :(

+2

'homes.select {| a | a.capacity> = 4} ' –

+1

' puts'は何も 'nil'を返します。単純に 'puts'で行を削除し、' high_capacities_homes'の前に 'puts'を挿入してください。 –

+0

sidenote:初期化中に簡単にエラーが発生することがあります。たとえば、引数が間違った順序で入れられているとします。おそらく、ハッシュを使用し、それに応じてinitializeメソッドを再定義するほうがよいでしょう。 –

答えて

3

はfalseと評価さそう、すべてのブロックはnil

high_capacities_homes = homes.select do |hm| 
    hm.capacity >= 4 
end 

puts high_capacities_homes 

puts戻りを試してみてください。

1

あなたのコードを実行するときは、以下を得る。さんは何が起こっているかを詳しく見てみましょう。

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 

:あなたのコードは、になります。

hmhomesの配列を作成したい場合は、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#selectselectのブロックがtrueを返すhomeshmれるすべての要素を保持することに留意されたいです。

今、何を印刷しますか?それが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 }を書くことができます。

関連する問題