我有一个函数,它将输入字符串散列到一个带有数字的列表中,并将其放在一个结构中。
def hash_input(input) do
hexList = :crypto.hash(:md5, input)
|> :binary.bin_to_list
%Identicon.Image{hex: hexList}
end我想写一个测试来确保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我尝试使用管道操作符(出于学习目的)来编写测试,但我无法通过模式匹配提取管道中的十六进制属性。
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我想要实现的目标有可能实现吗?
发布于 2020-09-08 20:07:37
你不能真的这样做,但是你可以做的是通过管道连接到Map.get来获得:hex,然后再通过管道连接到Enum.all?。
"løsdjflksfj"
|> Identicon.hash_input()
|> Map.get(:hex)
|> Enum.all?(&is_integer/1)如果您真的想在管道中使用模式匹配,请注意,您需要做的是确保沿管道传递的是您想要传递的值(在本例中为numbers)。
因此,您还可以使用一个匿名函数,该函数接受Identicon.hash_input/1的结果并生成:hex的值
"løsdjflksfj"
|> Identicon.hash_input()
|> (fn %{hex: numbers} -> numbers end).()
|> Enum.all?(&is_integer/1)注意匿名函数后面的.()。这意味着它应该在那里被调用。
但我要说的是,Map.get方法更惯用。
https://stackoverflow.com/questions/63793270
复制相似问题