推導式提供了一種能以宣告式輕鬆轉換 Enumerable 的機制。
要宣告一個最簡單的推導式,可以使用 for 關鍵字,後面接著一個 產生器,以及一個會根據列舉值建立新值的 do 區塊。
for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]
推導式也可以有 篩選條件。沒有通過篩選條件的值,會從最終的陣列中被移除:
for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]
我們可以跨越多行,宣告更複雜的推導式:
for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
rem(number, 2) == 0 do
atom
end
# => [:b, :d]
使用多個產生器可以建立 笛卡兒積。也就是說,第一個產生器產生的每個值,都會和第二個產生器產生的每個值配對一次:
for x <- [0, 1],
y <- [0, 1] do
{x, y}
end
# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]
你在線上時尚精品店的工作還在持續。你想到一個網站功能的點子,可以為使用者推薦穿搭。雖然你想提供大量的推薦,但你不希望給出糟糕的建議,所以你決定使用陣列推導式,因為這樣就能輕鬆_產生_穿搭組合,再依某些條件_篩選_它們。
衣物項目以映射的形式儲存:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
實作get_combinations/3,讓它接受一份上衣的陣列、一份下著的陣列,以及一份選項的關鍵字清單。目前先讓選項預設為空的關鍵字清單。這個函式應該回傳這些陣列的笛卡兒積。
tops = [
%{item_name: "Dress shirt"},
%{item_name: "Casual shirt"}
]
bottoms = [
%{item_name: "Jeans"},
%{item_name: "Dress trousers"}
]
BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
# {%{item_name: "Dress shirt"}, %{item_name: "Jeans"}},
# {%{item_name: "Dress shirt"}, %{item_name: "Dress trousers"}},
# {%{item_name: "Casual shirt"}, %{item_name: "Jeans"}},
# {%{item_name: "Casual shirt"}, %{item_name: "Dress trousers"}}
# ]
每件衣物都有:base_color欄位,請用這個欄位篩選掉所有上衣與下著底色相同的組合。
tops = [
%{item_name: "Dress shirt", base_color: "blue"},
%{item_name: "Casual shirt", base_color: "black"}
]
bottoms = [
%{item_name: "Jeans", base_color: "blue"},
%{item_name: "Dress trousers", base_color: "black"}
]
BoutiqueSuggestions.get_combinations(tops, bottoms)
# => [
# {%{item_name: "Dress shirt", base_color: "blue"},
# %{item_name: "Dress trousers", base_color: "black"}},
# {%{item_name: "Casual shirt", base_color: "black"},
# %{item_name: "Jeans", base_color: "blue"}}
# ]
每件衣物都有一個相關的:price欄位。雖然你想提供大量的推薦,但你也希望讓使用者有機會選擇符合預算的價格。從選項的關鍵字清單中,使用:maximum_price來篩選掉上衣與下著價格總和超過最高價格的組合。
如果沒有指定 maximum_price,預設值應該是100.00。
tops = [
%{item_name: "Dress shirt", base_color: "blue", price: 35},
%{item_name: "Casual shirt", base_color: "black", price: 20}
]
bottoms = [
%{item_name: "Jeans", base_color: "blue", price: 30},
%{item_name: "Dress trousers", base_color: "black", price: 75}
]
BoutiqueSuggestions.get_combinations(tops, bottoms, maximum_price: 50)
# => [
# {%{item_name: "Casual shirt", base_color: "black", price: 20},
# %{item_name: "Jeans", base_color: "blue", price: 30}}
# ]