Ruby 如何基于并行数组拒绝来自一个数组的值?

Ruby 如何基于并行数组拒绝来自一个数组的值?,ruby,arrays,Ruby,Arrays,给定 如果对应的fixnum不是偶数,如何获得number\u字符串的列表 number_strings = ["ichi", "ni", "san", "ku"] fixnums = [1, 2, 3, 9] 工作也一样 number_strings.reject.each_with_index do |string, index| fixnums.fetch(index).even? end 但是这两个都有点冗长。我认为它们都非常冗长 pairs = number_strings.z

给定

如果对应的fixnum不是偶数,如何获得number\u字符串的列表

number_strings = ["ichi", "ni", "san", "ku"]
fixnums = [1, 2, 3, 9]
工作也一样

number_strings.reject.each_with_index do |string, index|
  fixnums.fetch(index).even?
end

但是这两个都有点冗长。

我认为它们都非常冗长

pairs = number_strings.zip(fixnums)
pairs.reject{|_, fixnum| fixnum.even?}.map(&:first)

使用
fix
选择

Hash[number_strings.zip(fixnums)].select { |k, v| v.odd? }.keys

事实上,我认为你的解决方案很好,我能想到的唯一替代方案就是这个和那个一样冗长:

fixnums.zip(number_strings).select { |k, v| k.odd? }.map(&:last)
=> ["ichi", "san", "ku"]

在Ruby 1.9中,您可以执行以下操作:

number_strings.zip(fixnums).map { |str, fn| str if fn.odd? }.compact

您认为它有点冗长是对的,这是因为Ruby没有用于列表理解的语法。像Enumerable#Include这样的简单抽象非常接近(Include=map+compact),如果没有那么漂亮的话:


它需要
.map(&:first)
在末尾。
first
返回奇数的fixnum列表,
last
返回数字字符串
number_strings = ["ichi", "ni", "san", "ku"]
fixnums = [1, 2, 3, 9]

enum = fixnums.each
number_strings.select{ enum.next.odd? }
number_strings.zip(fixnums).comprehend { |s, n| s if n.odd? }