A listaértelmezések egyszerű és deklaratív módot kínálnak az Enumerable-ok átalakítására.
Egy egészen egyszerű értelmezéshez a for kulcsszót használhatjuk, amelyet egy generátor és egy do-blokk követ; ez utóbbi az enumerált értékekből állítja elő az új értékeket.
for n <- [0, 1, 2, 3], do: n + 1
# => [1, 2, 3, 4]
Az értelmezéseknek szűrői is lehetnek. Azok az értékek, amelyek nem mennek át a szűrőn, kimaradnak a végső listából:
for n <- [0, 1, 2, 3], n > 1, do: n + 1
# => [3, 4]
Bonyolultabb értelmezéseket több sorban is deklarálhatunk:
for {atom, number} <- [a: 1, b: 2, c: 3, d: 4],
rem(number, 2) == 0 do
atom
end
# => [:b, :d]
Több generátor használatával Descartes-szorzat hozható létre. Ez azt jelenti, hogy az első generátor által előállított minden érték egyszer párosul a második generátor által előállított minden értékkel:
for x <- [0, 1],
y <- [0, 1] do
{x, y}
end
# => [{0, 0}, {0, 1}, {1, 0}, {1, 1}]
Továbbra is az online divatbutikban dolgozol. Kitalálsz egy weboldalfunkciót, amely szettet javasol a felhasználónak. Sok javaslatot szeretnél adni, de rosszat nem, ezért a listakomprehenzió mellett döntesz, hiszen így könnyedén előállíthatsz szettkombinációkat, majd szűrhetsz rajtuk valamilyen szempont szerint.
A ruhadarabokat map formájában tároljuk:
%{
item_name: "Descriptive Name",
price: 99.00,
color: "Ochre Red",
base_color: "red"
}
Valósítsd meg a get_combinations/3 függvényt úgy, hogy az fogadja a felsők listáját, az alsók listáját és az opciók kulcsszólistáját. Egyelőre az opciók alapértelmezett értéke egy üres kulcsszólista legyen. A függvény adja vissza a listák Descartes-szorzatát.
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"}}
# ]
Minden ruhadarabnak van :base_color mezője; ezzel a mezővel szűrd ki azokat a kombinációkat, amelyekben a felső és az alsó alapszíne megegyezik.
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"}}
# ]
Minden ruhadarabhoz tartozik egy :price mező. Sok javaslatot szeretnél adni, de szeretnéd megadni a felhasználóknak a lehetőséget, hogy a keretükbe illő árat válasszanak. Az opciók kulcsszólistájából a :maximum_price segítségével szűrd ki azokat a kombinációkat, amelyeknél a felső és az alsó ára meghaladja a maximális árat.
Ha nincs megadva maximum_price, az alapértelmezett érték 100.00 legyen.
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}}
# ]
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.