Define a class User.MultiIterator
Class User.MultiIterator Extends %Persistent
{
Property i As %String;
Property j As %String;
Property k As %String;
Property val As %String;
Method startIterator()
{
set ..i=""
set ..j=""
set ..k=""
}
Method next()
{
if (..i="") {
set ..i=$order(^multi(..i))
quit ..next()
}
if (..j="") {
set ..j=$order(^multi(..i,..j))
quit ..next()
}
set ..k=$order(^multi(..i,..j,..k))
if ..k'="" {
set ..val = $get(^multi(..i,..j,..k))
quit 1
}
set ..j=$order(^multi(..i,..j))
if ..j'="" {
quit ..next()
}
set ..i=$order(^multi(..i))
if ..i'="" {
quit ..next()
}
quit 0
}
}
Using it (in another file) is now :
new it
set it= ##class(User.MultiIterator).%New()
do it.startIterator()
while it.next() {
write !,it.i_","_it.j_","_it.k_" : "_it.val
}
The logic is identical. The only difference, now I've made the i,j and k indices and the val properties of the iterator object rather than local variables passed by reference. It looks perhaps a little cleaner from the user's perspective. OTOH you have to create an extra class definition routine.
In the next post I think it's time to start thinking how we can add some filtering to the iterator.
Update : thanks to 80N for the correct. (Read comments)
3 comentários:
I think there's a typo in your startIterator method. The initialisation of the variables i, j and k should actually be initialising the properties ..i, ..j and ..k.
Oh, and User.MultiIterator doesn't need to be persistent, it can just extend %RegisteredObject.
80n
Doh!
Quite right about the initializer. Dodgy copy'n'pasing from previous version.
Many thanks. I've corrected it.
%Persistent I seem to have got as a default from the Class Wizard. I admit I don't yet understand all the subtleties of this yet.
What does %Registered actually mean? (Apart from non-persistent, maybe).
Yeah, a registered class is one that doesn't have all the baggage necessary for persistence - no %OpenId(), no %Save(), etc.
Postar um comentário