增加
For...Next循环的迭代器
语法
用法
For iterator [ As typename ] = start_value To end_value [ Step step_value ]
[ ...statements... ]
Next
参数
typename
stp ,
step_value
用作增量值的typename 对象
iterator
用作迭代器的typename 对象
end_value
用作循环终止值的typename 对象
start_value
用于初始化构造或赋值给迭代器的typename 对象
说明
例子
''示例类型
Type T
''值由构造函数设置
value As Double
Declare Constructor( ByVal x As Double = 0 )
Declare Operator For( ByRef stp As T )
Declare Operator Step( ByRef stp As T )
Declare Operator Next( ByRef cond As T, ByRef stp As T ) As Integer
End Type
Constructor T ( ByVal x As Double )
Print "T值迭代器" & x
value = x
End Constructor
Operator T.for( ByRef stp As T )
End Operator
Operator T.step( ByRef stp As T )
Print "递增" & stp.value & "在步骤"
value += stp.value
End Operator
Operator T.next( ByRef cond As T, ByRef stp As T ) As Integer
'' iterator's从高值移动到低值(步骤>= 0)
If( stp.value < 0 ) Then
Return( value >= cond.value )
Else
'' iterator's从低值移动到高值(步骤<0)
Return( value <= cond.value )
End If
End Operator
''使用示例看起来我们正在使用数字,但迭代器
''有重载的构造函数。10,1和-1都是T型。
For i As T = 10 To 1 Step -1
Print i.value;
Next i
一个更实际的例子演示基于
cha0s的文件迭代类的文件迭代。
''一个遍历文件的类
Type FileIter
As String pathName, fileName
Declare Constructor( ByRef pathName As String )
Declare Operator For()
Declare Operator Step()
Declare Operator Next( ByRef endCond As FileIter) As Integer
End Type
Constructor FileIter( ByRef pathName As String )
this.pathName = pathName
End Constructor
Operator FileIter.for( )
fileName = Dir(pathName & "/*.*")
End Operator
Operator FileIter.step( )
fileName = Dir("")
End Operator
Operator FileIter.next( ByRef endCond As FileIter ) As Integer
Return(fileName <> endCond.pathName)
'' the c'tor设置路径名称,所以我们检查
End Operator
''示例代码
''将其更改为任何目录
For i As FileIter = "./" To ""
Print i.fileName
Next
使用字符串的另一个例子:
Type CharIterator
''用来构建一个步骤var
Declare Constructor( ByVal r As ZString Ptr )
''隐式步骤版本
Declare Operator For ( )
Declare Operator Step( )
Declare Operator Next( ByRef end_cond As CharIterator ) As Integer
''明确的步骤版本
Declare Operator For ( ByRef step_var As CharIterator )
Declare Operator Step( ByRef step_var As CharIterator )
Declare Operator Next( ByRef end_cond As CharIterator, ByRef step_var As CharIterator ) As Integer
''给出当前的“价值”
Declare Operator Cast( ) As String
Private:
''数据
value As String
'' This member isn'必要 - 我们可以使用
''每个迭代的步变量 -
''但我们选择这种方法,因为我们有
''比较字符串。见下文。
is_up As Integer
End Type
Constructor CharIterator( ByVal r As ZString Ptr )
value = *r
End Constructor
Operator CharIterator.cast( ) As String
Operator = value
End Operator
''隐式步骤版本
''
''在这个例子中,我们解释隐含的步骤
'' to always mean 'up'
Operator CharIterator.for( )
Print "隐含的步骤"
End Operator
Operator CharIterator.step( )
value[0] += 1
End Operator
Operator CharIterator.next( ByRef end_cond As CharIterator ) As Integer
Return this.value <= end_cond.value
End Operator
''明确的步骤版本
''
''在这个例子中,我们计算方向
''在FOR中,但是由于步骤var被传递到
''每个操作符,我们有选择也可以计算
''它“即时”。对于这样的字符串,反复比较
'' may penalize, but if you'重新使用更简单的类型,
''那么你可能更喜欢避免开销
'' an 'is_up'变量。
Operator CharIterator.for( ByRef step_var As CharIterator )
Print "明确的步骤"
is_up = (step_var.value = "up")
End Operator
Operator CharIterator.step( ByRef step_var As CharIterator )
If( is_up ) Then
value[0] += 1
Else
value[0] -= 1
End If
End Operator
Operator CharIterator.next( ByRef end_cond As CharIterator, ByRef step_var As CharIterator ) As Integer
If( this.is_up ) Then
Return this.value <= end_cond.value
Else
Return this.value >= end_cond.value
End If
End Operator
For i As CharIterator = "a" To "z"
Print i; "";
Next
Print "DONE"
For i As CharIterator = "a" To "z" Step "up"
Print i; "";
Next
Print "DONE"
For i As CharIterator = "z" To "a" Step "下"
Print i; "";
Next
Print "DONE"
For i As CharIterator = "z" To "a" Step "up"
Print i; "";
Next
Print "DONE"
用分数迭代:
Type fraction
''用于构建一个步骤var
Declare Constructor( ByVal n As Integer, ByVal d As Integer )
''隐式步骤版本
Declare Operator For ( )
Declare Operator Step( )
Declare Operator Next( ByRef end_cond As fraction ) As Integer
''显式步骤版本
Declare Operator For ( ByRef step_var As fraction )
Declare Operator Step( ByRef step_var As fraction )
Declare Operator Next( ByRef end_cond As fraction, ByRef step_var As fraction ) As Integer
''给出当前的“价值”
Declare Operator Cast( ) As Double
Declare Operator Cast( ) As String
Private:
As Integer num, den
End Type
Constructor fraction( ByVal n As Integer, ByVal d As Integer )
this.num = n : this.den = d
End Constructor
Operator fraction.cast( ) As Double
Operator = num / den
End Operator
Operator fraction.cast( ) As String
Operator = num & "/" & den
End Operator
''一些分数函数
Function gcd( ByVal n As Integer, ByVal m As Integer ) As Integer
Dim As Integer t
While m <> 0
t = m
m = n Mod m
n = t
Wend
Return n
End Function
Function lcd( ByVal n As Integer, ByVal m As Integer ) As Integer
Return (n * m) / gcd( n, m )
End Function
''
''隐式步骤版本
''
''在这个例子中,我们解释隐含的步骤
''意思是1
''
Operator fraction.for( )
Print "隐含的步骤"
End Operator
Operator fraction.step( )
Var lowest = lcd( this.den, 1 )
Var mult_factor = this.den / lowest
Dim As fraction step_temp = fraction( 1, 1 )
this.num *= mult_factor
this.den *= mult_factor
step_temp.num *= lowest
step_temp.den *= lowest
this.num += step_temp.num
End Operator
Operator fraction.next( ByRef end_cond As fraction ) As Integer
Return This <= end_cond
End Operator
''
''显式步骤版本
''
Operator fraction.for( ByRef step_var As fraction )
Print "明确的步骤"
End Operator
Operator fraction.step( ByRef step_var As fraction )
Var lowest = lcd( this.den, step_var.den )
Var mult_factor = this.den / lowest
Dim As fraction step_temp = step_var
this.num *= mult_factor
this.den *= mult_factor
mult_factor = step_temp.den / lowest
step_temp.num *= mult_factor
step_temp.den *= mult_factor
this.num += step_temp.num
End Operator
Operator fraction.next( ByRef end_cond As fraction, ByRef step_var As fraction ) As Integer
If(( step_var.num < 0 ) Or ( step_var.den < 0 ) ) Then
Return This >= end_cond
Else
Return This <= end_cond
End If
End Operator
For i As fraction = fraction(1,1) To fraction(4,1)
Print i; "";
Next
Print "DONE"
For i As fraction = fraction(1,4) To fraction(1,1) Step fraction(1,4)
Print i; "";
Next
Print "DONE"
For i As fraction = fraction(4,4) To fraction(1,4) Step fraction(-1,4)
Print i; "";
Next
Print "DONE"
For i As fraction = fraction(4,4) To fraction(1,4)
Print i; "";
Next
Print "DONE"
方言差异
参考