Arr*_*rrr 3 generics sequence nimrod nim-lang
我有以下片段。但是,第二个变量声明不会编译:
type
Coin = ref object
Pen = ref object
let
yes : seq[ref object] = @[Coin(), Coin(), Coin()] #Compiles
no : seq[ref object] = @[Coin(), Pen(), Coin()] #Does not compile
Run Code Online (Sandbox Code Playgroud)
在 nim 中是否有可能有通用的 seqs,比如 java 的列表?
Nim 序列是通用的,但您并没有将相同类型的对象放入其中。在 Java 中,所有非原始类型(包括数组)都直接或间接地从 Object 超类继承,因此通过拥有一个List<Object>类型,您可以将任何内容放入其中。但在 Nim 中,并非所有东西都必须具有相同的根,在您的情况下,虽然对象看起来相同,但它们被视为不同的类型。所以你需要像java一样创建一个类层次结构:
type
BaseRef = ref object of TObject
CoinRef = ref object of BaseRef
PenRef = ref object of BaseRef
let
test1: seq[BaseRef] = @[(BaseRef)CoinRef(), CoinRef(), CoinRef()]
test2: seq[BaseRef] = @[(BaseRef)CoinRef(), PenRef(), CoinRef()]
Run Code Online (Sandbox Code Playgroud)
请注意,@[]列表构造仍需要捅了捅在正确的方向上的第一元素转换为基本类型或者你会得到一个不等式(一个seq[BaseRef]是不一样的seq[CoinRef],这将导致从类型推断)。
如果出于某种原因需要保留单独的根,作为 refs 应该可以直接强制转换它们,为此您可以创建辅助过程:
type
AnyRef = ref object
Coin = ref object
Pen = ref object
proc `^`(x: Coin): AnyRef = cast[AnyRef](x)
proc `^`(x: Pen): AnyRef = cast[AnyRef](x)
let
yes : seq[AnyRef] = @[^Coin(), ^Coin(), ^Coin()]
no : seq[AnyRef] = @[^Coin(), ^Pen(), ^Coin()]
Run Code Online (Sandbox Code Playgroud)
或者,也许创建转换特效不需要对所有的元素,只有第一,像继承版本的显式转换:
type
AnyRef = ref object
Coin = ref object
Pen = ref object
converter toAnyRef(x: Coin): AnyRef = cast[AnyRef](x)
converter toAnyRef(x: Pen): AnyRef = cast[AnyRef](x)
let
yes : seq[AnyRef] = @[Coin().toAnyRef, Coin(), Coin()]
no : seq[AnyRef] = @[Coin().toAnyRef, Pen(), Coin()]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
299 次 |
| 最近记录: |