编译错误,Elixir 中的未定义函数
Compilation error, undefined function in Elixir
我正在用 Elixir 制作扑克手牌分析器。该程序接受 52 个整数的输入,并将 5 张奇数(索引)牌分配给玩家 1,5 张偶数(索引)牌分配给玩家 2,然后再决定谁的手牌更好。我为每个玩家做了一个函数(下图)。当我尝试编译时,编译器抛出错误:(CompileError) poker.ex:49: undefined function player1/1。试了很多,好像都失败了,求助!
defmodule Poker do
decks = %{ 1 => "2C", 2 => "3C", 3 => "4C", 4 => "5C", 5 => "6C", 6 => "7C", 7 => "8C",
8=> "9C", 9=> "10C", 10 => "11C", 11 => "12C", 12 => "13C", 13 => "1C", 14 => "2D",
15 => "3D", 16=> "4D", 17 => "5D", 18=> "6D", 19=> "7D", 20=> "8D", 21=> "9D",
22=> "10D", 23=> "11D", 24=> "12D", 25=> "13D", 26=> "1D", 27=> "2H", 28=> "3H",
29=> "4H", 30=> "5H", 31=> "6H", 32=> "7H", 33=> "8H", 34=> "9H", 35=> "10H",
36=> "11H", 37=> "12H", 38=> "13H", 39=> "1H", 40=> "2S", 41=> "3S", 42=> "4S",
43=> "5S", 44=> "6S", 45=> "7S", 46=> "8S", 47=> "9S", 48=> "10S", 49=> "11S",
50=> "12S", 51=> "13S", 52=> "1S"}
defp player1(cards), do: Enum.take(Enum.drop_every(cards, 2), 5)
defp player2(cards) do
Enum.take(
cards -- (Enum.drop_every(cards, 2)) ,5)
end
mapHand = for n <- player1(cards), do: Map.get(decks, n)
end
我做错了什么?
您的代码存在一些问题。解决方案主要取决于您想做什么。查看 https://elixir-lang.readthedocs.io/en/latest/technical/scoping.html 以更好地理解 Elixir 中的作用域规则会对您有很大帮助。
对于您的情况,我建议的最直接的解决方案是替换所有匹配项,例如 mapHand = for n <- ...
函数。像这样:
defmodule Poker do
defp decks do
%{ 1 => "2C", 2 => "3C", 3 => "4C", 4 => "5C", 5 => "6C", 6 => "7C", 7 => "8C",
8=> "9C", 9=> "10C", 10 => "11C", 11 => "12C", 12 => "13C", 13 => "1C", 14 => "2D",
15 => "3D", 16=> "4D", 17 => "5D", 18=> "6D", 19=> "7D", 20=> "8D", 21=> "9D",
22=> "10D", 23=> "11D", 24=> "12D", 25=> "13D", 26=> "1D", 27=> "2H", 28=> "3H",
29=> "4H", 30=> "5H", 31=> "6H", 32=> "7H", 33=> "8H", 34=> "9H", 35=> "10H",
36=> "11H", 37=> "12H", 38=> "13H", 39=> "1H", 40=> "2S", 41=> "3S", 42=> "4S",
43=> "5S", 44=> "6S", 45=> "7S", 46=> "8S", 47=> "9S", 48=> "10S", 49=> "11S",
50=> "12S", 51=> "13S", 52=> "1S"}
end
defp player1(cards), do: Enum.take(Enum.drop_every(cards, 2), 5)
defp player2(cards) do
Enum.take(cards -- (Enum.drop_every(cards, 2)), 5)
end
def map_hand(cards) do
for n <- player1(cards), do: Map.get(decks(), n )
end
end
这样你就可以(在模块之外)做类似的事情:
player_1_cards = [1, 2, 3, 4, 5]
Poker.map_hand(player_1_cards)
然后得到类似的东西:
["3C", "5C"]
我正在用 Elixir 制作扑克手牌分析器。该程序接受 52 个整数的输入,并将 5 张奇数(索引)牌分配给玩家 1,5 张偶数(索引)牌分配给玩家 2,然后再决定谁的手牌更好。我为每个玩家做了一个函数(下图)。当我尝试编译时,编译器抛出错误:(CompileError) poker.ex:49: undefined function player1/1。试了很多,好像都失败了,求助!
defmodule Poker do
decks = %{ 1 => "2C", 2 => "3C", 3 => "4C", 4 => "5C", 5 => "6C", 6 => "7C", 7 => "8C",
8=> "9C", 9=> "10C", 10 => "11C", 11 => "12C", 12 => "13C", 13 => "1C", 14 => "2D",
15 => "3D", 16=> "4D", 17 => "5D", 18=> "6D", 19=> "7D", 20=> "8D", 21=> "9D",
22=> "10D", 23=> "11D", 24=> "12D", 25=> "13D", 26=> "1D", 27=> "2H", 28=> "3H",
29=> "4H", 30=> "5H", 31=> "6H", 32=> "7H", 33=> "8H", 34=> "9H", 35=> "10H",
36=> "11H", 37=> "12H", 38=> "13H", 39=> "1H", 40=> "2S", 41=> "3S", 42=> "4S",
43=> "5S", 44=> "6S", 45=> "7S", 46=> "8S", 47=> "9S", 48=> "10S", 49=> "11S",
50=> "12S", 51=> "13S", 52=> "1S"}
defp player1(cards), do: Enum.take(Enum.drop_every(cards, 2), 5)
defp player2(cards) do
Enum.take(
cards -- (Enum.drop_every(cards, 2)) ,5)
end
mapHand = for n <- player1(cards), do: Map.get(decks, n)
end
我做错了什么?
您的代码存在一些问题。解决方案主要取决于您想做什么。查看 https://elixir-lang.readthedocs.io/en/latest/technical/scoping.html 以更好地理解 Elixir 中的作用域规则会对您有很大帮助。
对于您的情况,我建议的最直接的解决方案是替换所有匹配项,例如 mapHand = for n <- ...
函数。像这样:
defmodule Poker do
defp decks do
%{ 1 => "2C", 2 => "3C", 3 => "4C", 4 => "5C", 5 => "6C", 6 => "7C", 7 => "8C",
8=> "9C", 9=> "10C", 10 => "11C", 11 => "12C", 12 => "13C", 13 => "1C", 14 => "2D",
15 => "3D", 16=> "4D", 17 => "5D", 18=> "6D", 19=> "7D", 20=> "8D", 21=> "9D",
22=> "10D", 23=> "11D", 24=> "12D", 25=> "13D", 26=> "1D", 27=> "2H", 28=> "3H",
29=> "4H", 30=> "5H", 31=> "6H", 32=> "7H", 33=> "8H", 34=> "9H", 35=> "10H",
36=> "11H", 37=> "12H", 38=> "13H", 39=> "1H", 40=> "2S", 41=> "3S", 42=> "4S",
43=> "5S", 44=> "6S", 45=> "7S", 46=> "8S", 47=> "9S", 48=> "10S", 49=> "11S",
50=> "12S", 51=> "13S", 52=> "1S"}
end
defp player1(cards), do: Enum.take(Enum.drop_every(cards, 2), 5)
defp player2(cards) do
Enum.take(cards -- (Enum.drop_every(cards, 2)), 5)
end
def map_hand(cards) do
for n <- player1(cards), do: Map.get(decks(), n )
end
end
这样你就可以(在模块之外)做类似的事情:
player_1_cards = [1, 2, 3, 4, 5]
Poker.map_hand(player_1_cards)
然后得到类似的东西:
["3C", "5C"]