如何解决如何将子类传递给需要父类型的proc参数?
可以将seq[Child]
手动转换为seq[Parent]
,但是也许有更好的选择?
type
ParentRef = ref object of RootObj
a: int
ChildRef = ref object of ParentRef
b: int
let parents = @[ParentRef()]
let children = @[ChildRef()]
proc process(list: seq[ParentRef]): void = discard list
process(parents)
process(children) # <== error
解决方法
Nim具有比许多类型更强大的类型系统,默认情况下,它仅根据these rules隐式转换类型。
我们在那里看到一个子类可以转换为其父类,
但是seq[type1]
仅在seq[type2]
时才可以转换为type1==type2
,即它们是相同的,而不是子类型。
要添加另一种隐式转换关系,可以定义一个类型转换器,具体情况视情况而定:
converter seqChildToSeqParent(c:seq[ChildRef]):seq[ParentRef]= c.mapIt(it.ParentRef)
或一般而言用于任何子类型:
converter toSeqParent[T:ParentRef](x:seq[T]):seq[ParentRef]= x.mapIt(it.ParentRef)
在定义了其中一个转换器之后,编译器将自动为您转换,并调用process(children)
进行编译和运行。
也许更好的选择是使用demo?
stream {
map $ssl_preread_server_name $name {
default server1;
app1.strangedreamsinc.com server1;
app2.strangedreamsinc.com server1;
}
upstream server1 {
server server1_ip:8443;
}
upstream server2 {
server server2_ip:8443;
}
server {
listen 443;
proxy_pass $name;
ssl_preread on;
}
}
实际上,如果您不添加type
Parent = object of RootObj
a: int
Child = object of Parent
b: int
let parents = @[Parent(a: 2)]
let children = @[Child(a: 3,b: 5)]
proc process[T: Parent](list: seq[T]): void =
echo repr(list)
echo "Accessing generic attribute a: ",list[0].a
process(parents)
process(children)
的限制,只要编译器在类型上找到它想要的所有字段,T : Parent
就可以工作:
proc
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。