How does this ruby injection magic work?

前端 未结 3 1523
余生分开走
余生分开走 2020-12-11 06:49

I saw a ruby code snippet today.

[1,2,3,4,5,6,7].inject(:+)  

=> 28

[1,2,3,4,5,6,7].inject(:*)  

相关标签:
3条回答
  • 2020-12-11 07:23

    As you can see in the docs, inject can take a block (like you're familiar with) or a symbol that represents the name of a binary operator. It's a useful shorthand for already-defined ops.

    0 讨论(0)
  • 2020-12-11 07:25

    There's no magic, symbol (method) is just one of the possible parameters. This is from the docs:

      # enum.inject(initial, sym) => obj
      # enum.inject(sym)          => obj
      # enum.inject(initial) {| memo, obj | block }  => obj
      # enum.inject          {| memo, obj | block }  => obj
    

    Ours case is the second one.

    You can also rewrite it with traditional block:

    op = :+   #  parameter of inject call
    [1,2,3,4,5,6,7].inject {|sum, x| sum.send(op, x)} #  also returns 28
    

    (to answer "how does it work" part)

    0 讨论(0)
  • 2020-12-11 07:32

    The :+ is a symbol representing the addition message. Remember that Ruby has a Smalltalk style where just about every operation is performed by sending a message to an object.

    As discussed in great detail here, (1..100).inject(&:+) is valid syntax in earlier versions where Rails has added the to_proc extension to Symbol.

    The ability to pass just a symbol into inject was new in 1.9 and backported into 1.8.7.

    0 讨论(0)
提交回复
热议问题