如何在ruby中映射数组?

时间:2014-05-18 02:39:29

标签: ruby map

我有一个整数数组

a = [3, 4, 5, 6]

我需要为这些数字付费,所以它们就像这样

a 
# => [9, 16, 25, 36]

我正试图用这段代码做到这一点:

a.map!(&:**2)

但不起作用:(

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:3)

如果您愿意,可以使用&的lambda:

square = lambda { |x| x**2 }
a.map!(&square)

这种事情是毫无意义的繁忙工作,一个块如此简单,但如果你有一系列这样的东西并且这些块更复杂,那就更好了:

ary.select(&some_complicated_criteria)
   .map(&some_mangling_that_takes_more_than_one_line)
   ...

收集lambdas中的逻辑位,以便您可以命名这些步骤有其用途。

答案 1 :(得分:2)

你应该这样做

a.map! { |i| i**2 }

阅读docs

答案 2 :(得分:1)

作为规则,您不能使用&:sym语法向方法添加参数。

但是,如果您按照我的建议here,您可以执行以下操作:

class Symbol
  def with(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end

a.map!(&:**.with(2))
# => [9, 16, 25, 36] 

答案 3 :(得分:0)

如果要在没有参数的对象上调用方法,则只能使用&:快捷方式语法。在这种情况下,您需要将2作为参数传递给**方法。

相反,将块扩展为完整语法

a.map! { |n| n**2 }