我在VBA中创建一个Immutable Linked List类.它提供ToArray和ToCollection方法,我已经验证了它的工作.但是该Get NewEnum() As IUnknown物业不起作用,我不知道为什么.
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = ToCollection.[_NewEnum]
End Property
Run Code Online (Sandbox Code Playgroud)
通过下面的代码与步进sequence作为SList与调试器
Public Function Copy(ByVal sequence As Variant) As SList
Dim made As New SList
Dim element As Variant
For Each element In sequence
Set made = made.Cons(element)
Next
Set Copy = made.Reverse
End Function
Run Code Online (Sandbox Code Playgroud)
显示正确构建集合的For Each element In sequence调用Get NewEnum,然后Copy在不执行迭代且没有错误之后返回并退出循环.我唯一的猜测是它NewEnum是一个变量的迭代器,它在退出时被销毁Get NewEnum.那是怎么回事?
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Set NewEnum = ToCollection.[_NewEnum]
End Property
Run Code Online (Sandbox Code Playgroud)
ToCollection每次调用时都会返回一个新的集合; 这可能会奏效:
Public Property Get NewEnum() As IUnknown
Attribute NewEnum.VB_UserMemId = -4
Static internalCollection As Collection
If internalCollection Is Nothing Then Set internalCollection = ToCollection
Set NewEnum = internalCollection.[_NewEnum]
End Property
Run Code Online (Sandbox Code Playgroud)
......但它相当难看.理想情况下,您需要一些实例级别encapsulated As Collection来返回[_NewEnum]值.