【问题标题】:Static call method in Dart Classes (make Classes callable)Dart 类中的静态调用方法(使类可调用)
【发布时间】:2013-12-04 10:06:11
【问题描述】:

对于嵌入式 DSL,我希望类表现得像一个函数。实例(https://www.dartlang.org/articles/emulating-functions/)似乎很容易,但我无法在课堂上实现它。我尝试创建一个静态调用方法,但这也不起作用。

有没有办法或者我必须给类起另一个名字并让 Pconst 成为一个函数,调用构造函数?

class Pconst {
  final value;
  Pconst(this.value);
  static Pconst call(value) => new Pconst(value);

  String toString() => "Pconst($value)";
}

void main() {
  var test = Pconst(10);
  // Breaking on exception: Class '_Type' has no instance method 'call'.

  print("Hello, $test");
}

【问题讨论】:

  • 为什么需要 Pconst 作为一个类?您可以创建一个顶级函数 Pconst(value) { return new PconstImpl(value).call(value);我必须承认我并不完全理解你想要达到的目标。你能提供更多信息吗?
  • 我知道除了类之外还可以创建一个顶级函数,但我真的不想弄乱我的命名空间,我更喜欢有类和函数/具有相同名称的可调用类。
  • 你为什么需要一堂课?恕我直言,只有在您调用 call(x) 的参数化实例时才有意义。您使用它的方式也可以使用函数(根本没有类)。
  • 我基本上想要一个不需要 new 关键字的构造函数,所以这个类确实有意义。我可能会使用另一个调用构造函数的顶级函数。希望有一条捷径:/。无论如何,谢谢!
  • 构造函数,你不需要new关键字,但是使用new表示它是构造函数,听起来你不知道你想要一个基本函数还是构造函数,如果你想要一个创建新对象的函数,然后只创建一个独立的函数来包装构造函数。

标签: function class call dart


【解决方案1】:
class TestA {
  call(int a, int b) => a + b;
}

void main()
  var TA = new TestA();

  int integer = TA(3, 4);
  print (integer); 
}

call() 方法是特殊的,因为任何定义call() 方法的人都被假定为动态模拟一个函数。这允许我们使用 TestA 的实例,就好像它们是带有两个整数参数的函数一样。

【讨论】:

  • 嗨,我知道调用方法以及它如何用于实例。我正在寻找是否有办法创建可直接调用的类。
  • 可直接调用的类...听起来像其他人在问题的 cmets 中所说的函数
【解决方案2】:

我会尝试这样的:

class _PConst{
    final value;
    _Pconst(this.value);

    String toString() => "Pconst($value)";
}

PConst(value){
    return new _PConst(value);
}

void main() {
    var test = Pconst(10);

    print("Hello, $test"); //should work ok
}

所以你基本上只是将你的类构造函数隐藏/包装在一个沼泽标准函数后面。

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 2015-09-26
    • 2023-04-05
    • 2011-01-13
    • 2012-05-24
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多