我正在练习练习练习,无法弄清楚为什么我会收到以下错误:
(CompileError) anagram.exs:19: cannot invoke remote function String.codepoints/1 inside match
(stdlib) lists.erl:1353: :lists.mapfoldl/3
(stdlib) lists.erl:1353: :lists.mapfoldl/3
我想我并不理解模式匹配,因为我不太明白我是如何在匹配中调用远程函数的。以下是上下文测试套件的几个示例:
defmodule AnagramTest do
use ExUnit.Case
test "no matches" do
matches = Anagram.match "diaper", ["hello", "world", "zombies", "pants"]
assert matches == []
end
test "detect simple anagram" do
matches = Anagram.match "ant", ["tan", "stand", "at"]
assert matches == ["tan"]
end
这是我的代码:
defmodule Anagram do
@doc """
Returns all candidates that are anagrams of, but not equal to, 'base'.
"""
@spec match(String.t, [String.t]) :: [String.t]
def match(base, candidates) do
base
|> String.codepoints
|> Enum.sort
|> scan_for_matches(candidates)
end
defp scan_for_matches(base, candidates) do
Enum.scan candidates, [], &(if analyze(&1, base), do: &2 ++ &1)
end
defp analyze(candidate, base) do
candidate
|> String.codepoints
|> Enum.sort
|> match?(base)
end
defp match?(candidate, base) do
candidate == base
end
end
我不只是将变量传递给analyze/2
函数,以便最终返回boolean
吗?我很欣赏任何见解。
答案 0 :(得分:3)
这确实需要一个答案,所以我想我会将其添加进来。match?/2
是默认情况下从Kernel
导出的函数。您可以通过import Kernel, except: [match?: 2]
覆盖默认导入。