読者です 読者をやめる 読者になる 読者になる

simanのブログ

ゆるふわプログラマー。競技プログラミングやってます。Ruby好き

Rubyで配列の足し算

ふと配列の足し算が必要になったので、sumメソッドあるだろーと思ったら

 

[1] pry(main)> a=[1,2,3,4]

=> [1, 2, 3, 4]

[2] pry(main)> a.sum

NoMethodError: undefined method `sum' for [1, 2, 3, 4]:Array

from (pry):2:in `__pry__'

 

これは驚いた、Rubyのメソッドはわりと直感的に操作できるところが

あって、最小値、最大値なんかは

 

[3] pry(main)> a.min

=> 1

[4] pry(main)> a.max

=> 4

 

こんな感じで出してくれる。

 

話は戻って。Arrayクラスにsumメソッドが無いなんて。。

 

* 無いなら自分で作ればいいじゃない *

 

[5] pry(main)> class Array 

[5] pry(main)*   def sum

[5] pry(main)*     self.inject(0){|sum,value| sum+=value }

[5] pry(main)*   end  

[5] pry(main)* end  

=> nil

[6] pry(main)> a.sum

=> 10

 

Arrayクラスをオーバーライドしてsumメソッド追加。これで完成〜

 

今回はsumメソッドが無いから作りましたが、実際にはsumメソッドが定義されて

いる場合もあるので

 

[1] pry(main)> Array.method_defined?(:sum)

=> false

 

method_defined?メソッドで先に調べると後々幸せになれるかも。

 

 おまけ

ちなみに配列の要素の掛け算はこんな感じになる

 

[2] pry(main)> class Array

[2] pry(main)*   def times

[2] pry(main)*     self.inject(1){|sum,value| sum*=value }

[2] pry(main)*   end  

[2] pry(main)* end  

=> nil

[3] pry(main)> a=[1,2,3,4]

=> [1, 2, 3, 4]

[4] pry(main)> a.times

=> 24

 
injectメソッド様々です