我有一个函数可以将输入字符串散列到一个带有数字的列表中,然后将它放在一个结构中。
def hash_input(input) do
hexList = :crypto.hash(:md5, input)
|> :binary.bin_to_list
%Identicon.Image{hex: hexList}
end
Run Code Online (Sandbox Code Playgroud)
我想编写一个测试来确保 hexList 中的每个元素都是一个整数,所以我想出了这个:
test "Does hashing produce a 16 space large array with numbers? " do
input = Identicon.hash_input("løsdjflksfj")
%Identicon.Image{hex: numbers} = input
assert Enum.all?(numbers, &is_integer/1) == true
Run Code Online (Sandbox Code Playgroud)
我尝试使用管道运算符(为了我自己的学习)编写测试,但我无法使用模式匹配提取管道中的十六进制属性。
test "Does hashing produce a 16 space large array with numbers? With pipe " do
assert Identicon.hash_input("løsdjflksfj")
|> %Identicon.Image{hex: numbers} = 'i want the input to the pipe operator to go here' # How do you extract the hex-field?
|> Enum.all?(&is_integer/1) == true
Run Code Online (Sandbox Code Playgroud)
我正在努力完成的事情是可能的吗?
你真的不能像那样管道,但你可以做的是管道进入Map.getget:hex然后管道进入Enum.all?.
"løsdjflksfj"
|> Identicon.hash_input()
|> Map.get(:hex)
|> Enum.all?(&is_integer/1)
Run Code Online (Sandbox Code Playgroud)
如果你真的想在你的管道中使用模式匹配,请注意你需要做的是确保沿着管道传递的只是你想要传递的值(在你的情况下numbers)。
因此,您还可以使用匿名函数来接收 的结果Identicon.hash_input/1并产生 的值:hex:
"løsdjflksfj"
|> Identicon.hash_input()
|> (fn %{hex: numbers} -> numbers end).()
|> Enum.all?(&is_integer/1)
Run Code Online (Sandbox Code Playgroud)
注意.()匿名函数之后的右边。这意味着它应该在那里被调用。
但我会说这种Map.get方法更惯用。