为什么相同类型的 NamedTuple 不兼容?
Why NamedTuple of same types are not compatible?
为什么同类型的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
这是一个错误,请在问题跟踪器中报告。谢谢!
为什么同类型的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
这是一个错误,请在问题跟踪器中报告。谢谢!