Arrays Ruby映射与压缩方法

Arrays Ruby映射与压缩方法,arrays,ruby,iterator,Arrays,Ruby,Iterator,给定一个数字n,我想返回它的阶乘(1*2*3…*n)。但是只有1和n之间的偶数 这是我现在的工作代码 def fact_even(n) arr = (1..n).map {|m| m if m % 2 == 0} new_arr = arr.compact new_arr.inject(&:*) end 给定块时,map返回一个新数组: [nil, 2, nil, 4, nil, 6] 之后我必须使用compact方法去除nils,然后使用inject获得阶乘的答案 有没

给定一个数字
n
,我想返回它的阶乘(
1*2*3…*n
)。但是只有
1
n
之间的偶数

这是我现在的工作代码

def fact_even(n)
  arr = (1..n).map {|m| m if m % 2 == 0}
  new_arr = arr.compact
  new_arr.inject(&:*)
end
给定块时,
map
返回一个新数组:

[nil, 2, nil, 4, nil, 6]
之后我必须使用
compact
方法去除
nil
s,然后使用
inject
获得阶乘的答案


有没有办法让
map
返回一个只有偶数的数组,这样我就不必在下一行使用
compact
?否则,有没有更有效的方法?

尝试使用
select

> (1..20).select { |r| r % 2 == 0}
=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
此外,您还可以尝试在下一行中使用
reduce

> (1..20).select { |r| r % 2 == 0 }.reduce(:*)
=> 3715891200

尝试使用
选择

> (1..20).select { |r| r % 2 == 0}
=> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
此外,您还可以尝试在下一行中使用
reduce

> (1..20).select { |r| r % 2 == 0 }.reduce(:*)
=> 3715891200

您可以使用
偶数?
而不是
r%2==0

n = 20
(1..n).select { |r| r.even? }.reduce(:*)
# Output: => 3715891200
请注意,
inject
reduce
都指向相同的方法

Range.instance_method(:inject) == Range.instance_method(:reduce)
# Output: => true

您可以使用
偶数?
而不是
r%2==0

n = 20
(1..n).select { |r| r.even? }.reduce(:*)
# Output: => 3715891200
请注意,
inject
reduce
都指向相同的方法

Range.instance_method(:inject) == Range.instance_method(:reduce)
# Output: => true

Ruby 2.7添加了
Enumerable#filter_map
。如果您使用的版本大于或等于2.7,您可以执行以下操作:

(1..n).filter_map { |m| m if m.even? }

但是,
select
对于您的情况来说是一个更好的选择。

Ruby 2.7添加了
Enumerable\filter\u map
。如果您使用的版本大于或等于2.7,您可以执行以下操作:

(1..n).filter_map { |m| m if m.even? }
但是,
select
对于您的案例来说是一个更好的选择