2012-06-23 101 views
0

奇怪的用法我花了一點時間今天解決了平衡指數的問題(描述here紅寶石平衡指數 - 中注入

寫我自己的解決方案(其中有大量表現不佳)後,我決定找一個那將是一個完美的分數。我發現這個(which Codility scores as 100/100):

def equi(a) 
    left, right = 0, a.inject(0, &:+) 
    indices = [] 
    a.each_with_index do |val, i| 
     right -= val 

     indices << i if right == left 

     left += val 
    end 
    indices 
    end 

我不明白的是,在該方法的頂部片並行分配和使用注射的。有人能夠描述這是在做什麼?

非常感謝! 斯圖

回答

2

它分配0到lefta的元素的總和爲right。 0參數在那裏,否則一個空數組將返回nil。用於求和的速記是Symbol#to_proc並且是不必要的,因爲inject直接以符號爲參數 - inject(0, :+)

+0

非常感謝@邁克爾科爾的解釋。我需要閱讀並行作業。有一點讓我更加奇怪的是,當我在賦值行之後插入一個調試器時,'left'和'right'的值都是0.我不應該期望'right'是val的總和該階段的數組?還是稍後評估? – Stu

+0

並行分配並不完全特殊。如果'a'爲空,'right'只應該爲0。 –

0

這只是一個數組的總和:

>> ar = (1..10).to_a 
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>> ar.inject(0, &:+) 
=> 55 
# or a shorter version 
>> ar.inject(&:+) 
=> 55 

你真的應該在Enumerable#inject方法讀取的doc。它解釋了一切。

+1

如果'ar == []',較短版本返回'nil'。 –

+0

欣賞注射部分的答案。我曾閱讀過關於注入的內容,但事實證明這是平行分配,使得它最容易混淆 – Stu