2017-02-19 61 views
2

我正在玩Ruby on Codecademy,不知道如何進一步減少這些。當前的代碼:在Ruby中的多個對象中使用枚舉數

group_1 = [4.1, 5.5, 3.2, 3.3, 6.1, 3.9, 4.7] 
group_2 = [7.0, 3.8, 6.2, 6.1, 4.4, 4.9, 3.0] 
group_3 = [5.5, 5.1, 3.9, 4.3, 4.9, 3.2, 3.2] 

over_4_feet = Proc.new { |height| height >= 4 } 

can_ride_1 = group_1.select(&over_4_feet) 
can_ride_2 = group_2.select(&over_4_feet) 
can_ride_3 = group_3.select(&over_4_feet) 

我不知道我怎麼會去這樣的事情:

can_ride_(1..3).each {|x| group_(x).select(&over_4_feet)} 

是否有可能,當對象保存重複的圖案像這樣做,以這種方式使用可枚舉的方法?我不介意它是否是正則表達式,但對可能推薦的模式感到好奇。

+0

有你看着。發送http://stackoverflow.com/questions/5349624/how-to-call-methods-dynamically-based-on-their-name – mahatmanich

+0

我覺得動態調度是你是什麼尋找... – mahatmanich

+0

@mahatmanich不會'group _#{x}'工作?我記得在某處看到這個'#' – niceman

回答

1

這是一個非常糟糕的問題(一上CodeAcademy),因爲代碼公然並不代表真實的世界。有人認爲圍繞行爲定義對象具有挑戰性。這就是說,這裏的另一個辦法,是純學術性的 - 永遠不要做在生產代碼:

group_1 = … 
group_2 = … 
group_3 = … 

can_ride_1 = can_ride_2 = can_ride_3 = nil 

1.upto(3) do |i| 
    group = binding.local_variable_get("group_#{i}") 
    binding.local_variable_set("can_ride_#{i}", group.select { |v| v >= 4 }) 
end 

這裏是這樣做的另一個剝削:

eligible_riders = -> (group_num) do 
    group = binding.local_variable_get("group_#{group_num}") 
    group.select { |v| v >= 4 } 
end 

can_ride_1 = eligible_riders[1] 
can_ride_2 = eligible_riders[2] 
can_ride_3 = eligible_riders[3] 

一個這樣做將是更合適的方式提取一個對象來表示每個group

class Group < Array 
    def select_eligible 
    select { |v| v >= 4 } 
    end 
end 

group_1 = Group.new [1, 2, 3, 4, 5] 
group_2 = Group.new [1, 2, 3, 4, 5] 
group_3 = Group.new [1, 2, 3, 4, 5] 

eligible = [group_1, group_2, group_3].map &:select_eligible 
can_ride_1, can_ride_2, can_ride_3 = *eligible 

或者你可以使用你的PROC把這些圖示增強功能:

can_ride_1, can_ride_2, can_ride_3 = *[group_1, group_2, group_3].map do |g| 
    g.select &over_4_feet 
end 
+0

是的,跳到字符串插值設置所需的跳躍量是不合適的。在上下文中仍然是一個有趣的心理練習(和FWIW,這個問題很好地隔離了不同的障礙行爲,就像它本身就是愚蠢的)。謝謝! – mbb

1

而不是每個組都有一個變量,你可以有一個組數組,所以你可以map到另一個陣列應用你的select在每個元素。

groups = [] 

groups.push [4.1, 5.5, 3.2, 3.3, 6.1, 3.9, 4.7] 
groups.push [7.0, 3.8, 6.2, 6.1, 4.4, 4.9, 3.0] 
groups.push [5.5, 5.1, 3.9, 4.3, 4.9, 3.2, 3.2] 

over_4_feet = Proc.new { |height| height >= 4 } 

can_ride = groups.map { |group| group.select(&over_4_feet) } 

puts can_ride 
+0

變量'group_1','group_2','group_3'就是問題中的提示(檢查鏈接),爲什麼不跳過另一個變量的創建並且只寫'[group_1,group_2,group_3] .map ... '? –

+0

@CarySwoveland看到第一句話,他說你不需要有「每個組的變量」。 – coreyward

+0

@coreyward,是的,但是這改變了這個問題,一個禁忌。此外,該解決方案應該針對三個變量中的每一個使用任何值(數組)。這隻適用於三個文字數組。是的,這是一個很糟糕的問題。 –