LoginSignup
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-14

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3