crystal-lang - 为什么相同类型的 NamedTuple 不兼容?
问题描述
为什么同类型的NamedTuple不兼容?
alias Data = NamedTuple(
title: String?
)
data : Data = { title: nil } # Explicitly specifying that
# it has ` : Data` type
proc = ->(data : Data){ p data }
proc.call data # And yet it says it's not
# of `Data` type
错误
Error: type must be NamedTuple(title: String | Nil), not NamedTuple(title: Nil)
解决方案
您的假设不正确:data : Data
将局部变量的类型限制为Data
(它是 的别名NamedTuple(title: String | Nil)
)。此类型限制不会影响右侧的值分配。文字值{type: nil}
的类型为NamedTuple(title: Nil)
。此类型与 的类型限制兼容Data
,因此可以将其分配给变量。
这种隐式协变类型限制不适用于 proc 类型。我不确定这背后的原因。看来这应该可以工作。所以也许它只需要实施。
但是,您可以显式NamedTuple(Nil)
转换为NamedTuple(String | Nil)
:
alias Data = NamedTuple(
title: String?
)
data = { title: nil }.as(Data) # Cast named tuple to Data
proc = ->(data : Data){ p data }
proc.call data
但是,将命名元组用作常规数据类型通常不是一个好主意。仅建议将它们用于非常特定的用例,例如命名参数。定义自定义结构(例如使用记录宏)是一个更好的主意,并为您提供更强大和灵活的数据类型。我会像这样实现你的例子:
record Data,
title : String?
data = Data.new(title: nil)
proc = ->(data : Data){ p data }
proc.call data
推荐阅读
- reactjs - 我如何在来自 firebase 的 react js 中迭代这些数据并捕获用户生成的关键数据
- swift - RealityKit – 无法正确旋转对象
- excel - 如何跨多个工作簿/工作站维护 Power Query 代码?
- javascript - 如何根据注入的组件对组件中的 *ngFor 进行切片?
- mongodb - 如何根据选择框过滤器查找Mongodb文档并显示结果
- mongodb - MongoDB 社区 Kubernetes 操作员连接
- c++ - 使用 neon/simd 优化 Vector3 类
- javascript - 通过单击其中一个来猜测获胜按钮 - Vanilla JS
- python - 如何在烧瓶应用程序中为 SIGPIPE 信号编写自定义处理程序
- android - Android Studio 4.2.1 布局检查器不起作用