Rubyのinjectには初期値を明示的に指定したほうがいい

  • 4
    Like
  • 2
    Comment
More than 1 year has passed since last update.

ruby injectの第一引数のデフォルト値は配列の先頭の値になるため、平方和などを計算するときは初期値を明示指定する必要がある.
ruby injectの第一引数を指定した場合と指定しない場合では、配列走査の動きが異なるので、平方和などを計算するときは初期値を明示指定する必要がある.
http://docs.ruby-lang.org/ja/2.1.0/class/Enumerable.html#I_INJECT

総和の場合は問題ない

[1,2,3].inject {|sum,n| sum+n }
  # => 6
[3,2,1].inject {|sum,n| sum+n }
  # => 6

平方和の場合は問題あり

[1,2,3].inject {|sum,n| sum+n*n }
  # => 14
[3,2,1].inject {|sum,n| sum+n*n }
  # => 8

和の計算などで使う場合は初期値0を指定する

[1,2,3].inject(0) {|sum,n| sum+n }
  # => 6
[1,2,3].inject(0) {|sum,n| sum+n*n }
  # => 14
[3,2,1].inject(0) {|sum,n| sum+n }
  # => 6
[3,2,1].inject(0) {|sum,n| sum+n*n }
  # => 14

Environment

% uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

% ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]

% cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m