[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  }