在Ruby中跨多个对象使用枚举

在Ruby中跨多个对象使用枚举,ruby,Ruby,我正在玩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

我正在玩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)}

当对象持有像这样的可重复模式时,是否有可能以这种方式使用可枚举方法?我不介意它是否是正则表达式,但我想知道应该推荐什么样的模式。

您可以有一个组数组,而不是每个组都有一个变量,这样您就可以将它映射到在每个元素中应用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

这是一个关于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]
更合适的方法是提取一个对象来表示每个组:


你看过了吗?send我想动态调度是你要找的…@mahatmanich不工作吗?我记得在什么地方看到过这个。call.send.eval正在做类似的事情=>@niceman不,它不会,它只会做字符串插值,但会返回一个字符串。group_{x}将返回group_1,group_2,但只返回字符串。另一方面,sendgroup{x}应该可以工作!问题中给出了变量组_1、组_2、组_3。检查链接,那么为什么不跳过另一个变量的创建,只写[group_1、group_2、group_3]。映射…?@CarySwoveland看到第一句话,他说不需要“每个组都有一个变量”。@coreyward,是的,但这改变了问题,答案是否定的。此外,解决方案应该适用于三个变量中每个变量的任何值数组。这只适用于三个文本数组。是的,这是一个糟糕的问题。@CarySwoveland,OP已经拥有的代码是正确的codecademy说可以,所以我想OP不希望代码通过codecademy挑战,因为他已经锁定了它。OP只是想知道一些方法来概括代码,因为他看到了很多重复和类似的事情。这段代码来自codecademy这一事实与此无关。请看问题中的最后一句话:当对象具有像这样的可重复模式时,是否有可能以这种方式使用可枚举方法?更好的方法是一次声明所有组:groups=[…],[…],…]以避免重复的推送调用。另外,因为这个过程只使用一次,所以它也可能是内联的。是的,进入字符串插值设置所需的舞蹈量是不可能的。在上下文和FWIW中,这仍然是一个有趣的心理练习,这个问题在隔离不同的块行为方面非常好,就像它本身一样愚蠢。谢谢
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
can_ride_1, can_ride_2, can_ride_3 = *[group_1, group_2, group_3].map do |g|
  g.select &over_4_feet
end