Ruby 初心者スレッド Part 45at TECH
Ruby 初心者スレッド Part 45 - 暇つぶし2ch858:デフォルトの名無しさん
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)


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch