如何在Elixir中正确断言结构体类型?有无更优雅写法?
更优雅的Elixir结构体类型断言方式
当然有更优雅的实现方式啦!Elixir其实内置了专门用于结构体类型检查的函数,比直接比较__struct__字段更规范、也更符合惯用写法。
你可以用is_struct/2函数来断言某个值是否是指定结构体的实例,用法非常简单:
assert is_struct(foo, Foo)
这个函数的好处在于:
- 它会先检查
foo本身是不是结构体类型(避免了如果foo不是结构体时,直接访问__struct__字段会抛出错误的问题) - 写法更简洁直观,一眼就能看出你在做结构体类型断言
至于你提到的assert type(foo) == %Foo{}这种写法,其实是行不通的——因为Elixir里的type/1函数对于结构体返回的是:map(毕竟结构体本质上是带有特殊__struct__字段的map),所以这种比较永远不会成立。
另外,如果只是想断言某个值是任意结构体(不限制具体类型),可以用单参数的is_struct/1:
assert is_struct(foo)
内容的提问来源于stack exchange,提问作者lapinkoira
相关产品推荐
相关产品推荐

