[NAME] ALL.dao.data.invar [TITLE] 定变量 [DESCRIPTION] 在每个可以使用var的地方,invar也可被使用。 invar则声明的是局部,全局或成员定变量。 1 invar invariable = "global invariable" 2 for(var i = 1 : 5 ) { 3 invar invariable = 123 4 if( i > 3 ) { 5 invar invariable = "local invariable" 6 io.writeln( invariable ) # 输出: local invariable 7 } 8 io.writeln( invariable ) # 输出: 123 9 } 10 io.writeln( invariable ) # 输出: global invariable 定变量和常量很像,也是一旦被初始化了,就不能再被改变。 但不象常量那样一定要用常量表达式初始化 ,定变量可由普通变量或表达式初始化。 尽管定变量的值不能通过定变量本身去改变,它的值还是可通过 其他变量改变。 1 var varlist = { 123 } 2 invar invlist = varlist 3 4 varlist.append( 456 ) # 可以! 现在, invlist = { 123, 456 } 5 invlist.append( 456 ) # 错! 另外invar还可用在函数参数里,表示定变量参数。 1 routine Rout( invar abc = 123 ) 2 { 3 abc += 1 # Error! 4 } 尽管定变量的值在声明后不能在被修改,它的值却可以在声明处被替换。例如: 1 for(var i = 1 : 3 ){ 2 invar index = i # 好,可以替换! 3 index += i # 错,不可以修改! 4 } 但是类实例的定变量可以在类构造函数里任意地方初始化。 1 class Klass 2 { 3 invar mapping = {=>} 4 5 routine Klass( name: string, value: int ) { 6 mapping = { name => value } # OK! 7 } 8 routine Method() { 9 mapping = { "abc" => 123 } # Error! 10 mapping[ "abc" ] = 123 # Error! 11 } 12 } invar也可被用来定义类似于C++里的常方法, 即参数列表括号后面带invar的方法不可修改 其类实例的 成员变量。 1 class Klass 2 { 3 var value = 123 4 5 routine Modify() { 6 value += 456 7 } 8 routine Method() invar { 9 Modify() # Error! 10 value += 456 # Error! 11 return value + 456 12 } 13 }