我正在尝试测试构建HashDict的算法,但是我无法将“预期”变为实际等于我的“实际”。例如,
iex> expected = HashDict.new([ key: 12 ])
#HashDict<[foo: 12]>
iex> actual = Dict.put(HashDict.new, "key", 12)
#HashDict<[{"foo", 12}]>
我可以通过以更加钝的方式声明它来获得HashDict
的第二个“样式”:
iex> HashDict.new([ { "key", 12 } ])
#HashDict<[{"foo", 12}]>
我非常喜欢我的测试用例的简单Dict文字语法,但是我的实现以递归方式构建了Dict。我怎样才能使这些相等?
答案 0 :(得分:6)
在第一种情况下,键是一个原子,但在第二种情况下,它是一个字符串。
您可以在iex上执行此操作:
expected = HashDict.new([key: 12])
actual = Dict.put(HashDict.new, :key, 12)
Dict.equals? actual, expected # returns true
有关详细信息,请访问:http://elixir-lang.org/docs/stable/
答案 1 :(得分:0)
这是一个古老的问题(目前HashDict已在许多Elixir版本中弃用),但我认为我会针对当前Elixir版本对其进行更新,以防将来有人发现它。
这些天,您应该使用Map而不是HashDict。
Map文字语法可以像这样将字符串作为键来支持:
%{"foo" => 12}
当然,这与在Map文字中使用原子键不同,后者在习惯上是这样声明的:
%{foo: 12}
只是这样声明语法糖:
%{ :foo => 12 }