0

我正在尝试测试一种构建 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。我怎样才能使这些相等?

4

2 回答 2

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/

于 2013-07-23T00:45:35.667 回答
0

这是一个老问题(HashDict 目前已在很多 Elixir 版本中被弃用),但我想我会为当前的 Elixir 版本更新它,以防其他人在未来发现它。

这些天你应该使用Map而不是 HashDict。

Map 文字语法可以支持字符串作为键,如下所示:

%{"foo" => 12}

当然,这与在 Map 文字中使用原子键不同,后者的惯用声明如下:

%{foo: 12}

这只是像这样声明它的语法糖:

%{ :foo => 12 }
于 2020-02-10T13:44:39.410 回答