代码之家  ›  专栏  ›  技术社区  ›  Alexey Orlov

Dart:一项封闭性研究

  •  2
  • Alexey Orlov  · 技术社区  · 6 年前

    这个片段没有实际意义。我刚刚习惯了收尾的想法。

    var cls = () {
      var x = 5;
      return {
        'x': x,
        'inc': () {x++;},
      };
    } ();
    
    void main() {
      print(cls['x']);
      print(cls['inc']);
      cls['inc']();
      print(cls['x']);
    }
    

    省道板输出:

    5
    Closure '_closure'
    5
    Error compiling to JavaScript:
    main.dart:18:13:
    Error: The method 'call' isn't defined for the class 'dart.core::Object'.
    

    期望的输出应该是

    5
    6
    

    做这种运动最干净的方法是什么?

    升级版:

    工作榜样,承蒙 GÃ四分之一中心ZÃ :

    var cls = () {
      var x = 5;
      var map = <String, dynamic>{
        'x': x,
      };
      map['inc'] = () {map['x']++;};
      return map;
    } ();
    
    void main() {
      print(cls['x']);
      print(cls['inc']);
      cls['inc']();
      print(cls['x']);
    }
    

    省道板输出:

    5
    Closure '_closure'
    6
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Xavier    6 年前

    必须将“x”项声明为函数。

    在代码中,当返回映射时,将“x”设置为“x”变量(5)的值。该值将始终为5且不会更新。

    var cls = () {
      var x = 5;
      return {
        'x': () => x,
        'inc': () {x++;},
      };
    }();
    
    void main() {
      print(cls['x']()); // 5
      print(cls['x']); // Closure: () => int
      print(cls['inc']); // Closure: () => Null
      cls['inc']();
      print(cls['x']()); // 6
    }
    
        2
  •  2
  •   Günter Zöchbauer    6 年前
    var x = 5;
    var cls = () {
      return {
        'x': x,
        'inc': () {x++;},
      };
    } ();
    

    您需要移出变量声明,否则您需要重新声明并将其重新初始化为 5 每次呼叫。

    更新

    var cls = () {
      var x = 5;
      var map = {
        'x': x,
       // 'inc': () {map['val']++;}, // not possible to reference the `map` variable that is just declared here so we need to move this out
      };
      map['inc'] = () {map['x']++;};
    } ();