2017-03-05 57 views
0

我有元組的列表:藥劑列表理解

m=[{5, 3}, {6, 6}, {7, 10}] 

現在我想創建第二個列表,從而爲內部M值的每個元組,我將插入「A」,如果第一個值>第二值, 「B」如果首先是<秒。因此,在這種情況下,列表將導致[「A」,「B」(因爲5> 3和7 < 10) 我用下面的代碼:

res= for {u,v} <- m do if u>v do "A" end 
         if u<v do "B" end 
        end 

然而它導致了以下內容:

[nil, nil, "B"] 

我無法弄清楚什麼是錯誤的?在此先感謝

回答

2

我無法弄清楚什麼是錯的?

你的第一if表達是由編譯器完全忽略了,因爲你有之後的另一種表達(如果你編譯這個混音中的項目,你應該得到一個警告)。 Elixir只返回最後一個表達式的值,在本例中爲"B"u < v)或nil

您可以使用elseifcond使這裏有一個在do只有一個表達式:

res = for {u,v} <- m do 
    if u > v do 
    "A" 
    else 
    "B" 
    end 
end 

res = for {u,v} <- m do 
    cond do 
    u > v -> "A" 
    u < v -> "B" 
    end 
end 

注意,第一個將返回"B"如果u == v和如果是u == v,第二個會引發異常。我不確定你想要哪一個。

+0

謝謝。其實我想忽略你== == v。我已經嘗試了第一種解決方案,但它包含了我只想忽略的平等案例。 –

+0

其實我解決了我的問題。我只想計算第二個列表中的As和Bs的數量,所以在cond中,我只是爲u == v添加了一個不同的條件。非常感謝。 –

+0

for-comprehensions也可以過濾,所以如果你只是想忽略'u == v',你可以添加過濾器'u!= v'。因此,對於{u,v} < - m,u!= v,做:if(u> v do:「A」,else:「B」)' –