Set

badge

一个Set代表一个集合,它在结构上是一个重复的无序数组

assert Set.from([1, 2, 3, 2, 1]) == {1, 2, 3}
assert {1, 2} == {1, 1, 2} # 重复的被自动删除
assert {1, 2} == {2, 1}

它也可以用类型和长度来声明

a: {Int; 3} = {0, 1, 2} # OK
b: {Int; 3} = {0, 0, 0} # NG,重复的内容被删除,长度也会改变
# TypeError: the type of b is mismatched
# expected:  Set(Int, 3)
# but found: Set({0, }, 1)

此外,只有实现Eq跟踪的对象才能成为集合的元素

因此,不可能使用Floats等作为集合元素

d = {0.0, 1.0} # NG
#
# 1│ d = {0.0, 1.0}
#         ^^^^^^^^
# TypeError: the type of _ is mismatched:
# expected:  Eq(Float)
# but found: {0.0, 1.0, }

Set可以执行集合操作

assert 1 in {1, 2, 3}
assert not 1 in {}
assert {1} or {2} == {1, 2}
assert {1, 2} and {2, 3} == {2}
assert {1, 2} not {2} == {1}

Set是同质集合。为了使不同类的对象共存,它们必须同质化

s: {Int or Str} = {"a", 1, "b", -1}

Sets为类型

Sets也可以被视为类型。这种类型称为 枚举类型

i: {1, 2, 3} = 1
assert i in {1, 2, 3}

Set的元素直接是类型的元素 请注意,这些Set本身是不同的

mut_set = {1, 2, 3}.into {Int; !3}
mut_set.insert!(4)