2017-02-19 63 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,是的,但是这改变了这个问题,一个禁忌。此外,该解决方案应该针对三个变量中的每一个使用任何值(数组)。这只适用于三个文字数组。是的,这是一个很糟糕的问题。 –