Search code examples
rubysymbolsinjectenumerableproc

Symbol vs. Proc in `Enumerable#inject`


Given that Enumerable#inject can take either a symbol or a block as the method to be used in the iteration, as explained in an answer to this question, is there any reason to use the & in conjunction with Symbol#to_proc within Enumerable#inject? The following pairs return the same result:

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

[:a, :b, :c].inject({a: {b: {c: 1}}}, :fetch)
[:a, :b, :c].inject({a: {b: {c: 1}}}, &:fetch)

Is there any use case where using a symbol and using a block (created by &) have different results? Are there any cases where one can be used and not the other?


Solution

  • If you have to support old versions of Ruby (1.8.6 or older) and you're using a library that defines Symbol#to_proc for those versions (like active support), the version using & will work and the other will not.

    Other than that the only differences between the two versions are that the version using a symbol is faster and that the version using & will be affected if you redefine Symbol#to_proc - though I can't think of a case where that'd be useful. So no, if you don't need to support Ruby 1.8.6, there's no reason to not use the symbol form.