11/09/30 17:18:26.08
Array#sumってないんだな
全要素+メソッド呼ぶとかであってもいいようなきがするが
859:デフォルトの名無しさん
11/09/30 17:25:03.11
>>857
超初心者なので、もっともっと簡単な記述でお願いします。
sum=Array.new(3)で配列作ってそこからがよくわかりません。
860:デフォルトの名無しさん
11/09/30 17:32:56.51
>>857
injectのブロックは式を返せばいいので代入(+=)は不要、加算(+)だけでいい
X: i.inject(0){ |s, n| s += n }
O: i.inject(0){ |s, n| s + n }
>>858
その汎用的な仕掛けがinjectメソッドではないのかと思われ
861:デフォルトの名無しさん
11/09/30 17:42:39.87
>>859
プログラミングの超初心者?
何か本とかWeb資料とかで一通り勉強したほうがいいよ
それからわからないことを聞けばいい
862:デフォルトの名無しさん
11/09/30 17:42:51.13
inject(:+)
863:デフォルトの名無しさん
11/09/30 17:45:49.15
初心者に inject とか教えても意味ないような。
864:デフォルトの名無しさん
11/09/30 17:56:18.57
def sum(args)
ret = 0
args.each{|i| ret += i}
ret
end
x=[[1,2,3],[4,5,6], [7,8,9]]
y = []
x.each{|i| y << sum(i)}
p y
865:デフォルトの名無しさん
11/09/30 18:12:08.46
>>859
これなら理解できるかな?
x = [[1,2,3], [4,5,6], [7,8,9]]
sum = []
for ary in x
e = 0
for i in ary
e += i
end
sum << e
end
p sum
これでもダメなら、(>>861の言うように)プログラミングの基礎から勉強したほうがいい。
866:デフォルトの名無しさん
11/09/30 18:28:19.59
そろそろ inject(:+) とかは、inject の本格的な使い方とは別に、
イディオムとして教えてしまっていいと思う。
18 の古いのを使ってない限り使えるし。
867:デフォルトの名無しさん
11/09/30 18:30:25.26
Pythonスレから来ました、まで読んだ
868:デフォルトの名無しさん
11/09/30 20:10:08.47
inject(:+)は、関数型では完全にイディオムとして成立してるね(injectじゃなくてfoldだったりするけど)
手続き型ではまだまだイディオムと呼ばれるには遠いが、injectやreduceがあるなら使えるはず
869:デフォルトの名無しさん
11/09/30 21:29:39.75
>>865
ありがとうございます。
こちらの方をベストアンサーとさせていただきます。
870:デフォルトの名無しさん
11/09/30 21:32:37.62
>>869
知恵袋かっ
871:デフォルトの名無しさん
11/09/30 21:37:52.08
>>868
イディオムっていうか理論的な基板があるんじゃなかったっけ?
872:デフォルトの名無しさん
11/09/30 21:44:48.97
eachはメソッド名やサンプルからもなんとなくわかる
mapもメソッド名やサンプルからなんとなくわかる可能性はある(そう高くはないが)
しかしinjectを一発理解することはおそらく不可能
そもそも畳み込み関数自体がレアだし、
数式ではなく汎用データに対してのプログラムとして表現されるとこれは既に別物
inject(:+) と書いてあって「なるほどー」とか思えたならその人は嘘つきか、欧米の顔文字かなにかと勘違いしている
873:デフォルトの名無しさん
11/09/30 22:40:56.14
% irb
rb> total = 0
=> 0
rb> [1, 4, 7].each{|num| total += num }
=> [1, 4, 7]
rb> total
=> 12
rb> [1, 4, 7].inject(0){|total, num| total += num }
=> 12
# 計算過程のイメージ
0 [1, 4, 7]
0 + 1 [4 ,7]
0 + 1 + 4 [7]
0 + 1 + 4 + 7
rb> [1, 4, 7].inject(:+)
=> 12
874:デフォルトの名無しさん
11/09/30 22:48:56.60
>>873
だから、injectに与えるブロックは(副作用の無い)式を返せばいいんだから、代入は不要だよ
X: [1, 4, 7].inject(0) { |total, num| total += num }
O: [1, 4, 7].inject(0) { |total, num| total + num }
875:デフォルトの名無しさん
11/09/30 22:56:10.20
>>874
ああおっしゃるとおり。気をつけるよ
876:デフォルトの名無しさん
11/09/30 23:00:35.49
チラ裏だけど、injectは数値の集計以外にも使える
たとえば、以下はArrayからHashを作る処理
irb> alist = [[1,["a"]], [2,["b"]], [3,["c"]]]
=> [[1, ["a"]], [2, ["b"]], [3, ["c"]]]
irb> alist.inject({}) { |h, (k,v)| h.merge({ k => v }) }
=> {1=>["a"], 2=>["b"], 3=>["c"]}
これは以下と同じ
irb> Hash[alist]
=> {1=>["a"], 2=>["b"], 3=>["c"]}
877:デフォルトの名無しさん
11/09/30 23:14:51.18
さてはきさま>>710だな。
878:デフォルトの名無しさん
11/10/01 01:59:01.65
def sum1(x)
x.inject(:+)
end
sum2 = -> x{x.inject(:+)}
a=[1,4,7]
p sum1(a)
p sum2.(a)
b=[sum2]
p b[0].(a)