Ruby有类似Python的列表推导吗?

def*_*hlt 10 ruby python programming-languages

Python有一个很好的功能:

print([j**2 for j in [2, 3, 4, 5]]) # => [4, 9, 16, 25]
Run Code Online (Sandbox Code Playgroud)

在Ruby中,它甚至更简单:

puts [2, 3, 4, 5].map{|j| j**2}
Run Code Online (Sandbox Code Playgroud)

但如果它是关于嵌套循环Python看起来更方便.

在Python中我们可以这样做:

digits = [1, 2, 3]
chars = ['a', 'b', 'c']    
print([str(d)+ch for d in digits for ch in chars if d >= 2 if ch == 'a'])    
# => ['2a', '3a']
Run Code Online (Sandbox Code Playgroud)

Ruby中的等价物是:

digits = [1, 2, 3]
chars = ['a', 'b', 'c']
list = []
digits.each do |d|
    chars.each do |ch|
        list.push d.to_s << ch if d >= 2 && ch == 'a'
    end
end
puts list
Run Code Online (Sandbox Code Playgroud)

Ruby有类似的东西吗?

Mic*_*ohl 11

Ruby中常见的方法是正确组合EnumerableArray方法来实现相同的目的:

digits.product(chars).select{ |d, ch| d >= 2 && ch == 'a' }.map(&:join)
Run Code Online (Sandbox Code Playgroud)

这个字符只比列表理解长4个左右,而且表达性很强(当然,恕我直言,但由于列表推导只是列表monad的一个特殊应用,人们可能会认为使用Ruby的集合方法可能会充分重建它),虽然不需要任何特殊的语法.