微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将子类传递给需要父类型的proc参数?

如何解决如何将子类传递给需要父类型的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 举报,一经查实,本站将立刻删除。