2

你可以在 dart 中为函数添加属性吗?我试过这个:

void main(){

    fn(){
        //DoSomething
    };

    fn.id = 1; //Exception NoSuchMethod

}

只是为了得到一个 NoSuchMethod 异常抛出。有没有办法在运行时向函数或任何类型的对象添加属性,比如在 javascript 中?

(还有为什么当我分配给一个属性时它说没有这样的方法异常?)

4

3 回答 3

4

您不能在Function上添加属性。但是,您可以定义一个Object可以像函数一样调用的函数(请参阅Dart 中的模拟函数)。这是一个例子:

class WannabeFunction {
  var id;
  call(int a, int b) => a + b;
}

main() {
  var wf = new WannabeFunction();
  wf.id = 1;
  wf(3, 4); // 7
}

对于NoSuchMethodError: 当您使用时,fn.id = 1您实际上调用了一个隐式设置id=fn。这就是您收到此错误的原因。

于 2013-05-08T21:08:54.420 回答
1

您不能添加或删除对象的成员。从概念上讲,对象是一个小结构,带有指向其类描述的指针和一些用于存储其状态的内存。类描述定义了结构在分配点的布局。如果类描述不包含字段id(如您的示例中),则根本无法添加它。您既不能更改类描述也不能更改实际实例(因此它有更多的内存用于额外的字段)。这可能很烦人(尤其是对于那些用于动态修改其对象的 JavaScripters),但它为程序员提供了一定的保证并使其更容易优化。对象使用更少的内存,优化编译器可以做出否则不成立的假设。

但是,有一种方法可以使用expandos从侧面添加属性

于 2013-05-09T10:57:30.687 回答
0

简单地说没有。
不过,Expando 可以模仿这一点。

var e = new Expando();
e[f] = 'hi';
print(e[f]);//prints hi

宣传我的包裹可能不合适,但因为它是相关的:

import 'package:mistletoe/mistletoe.dart';
Dynamism d = new Dynamism(expert:true);
void main(){
    var o = new Object();
    d.on(o).greetings = ()=>print('hello world');
    d.on(o).greetings();//prints hello world
    o = null;
    //With o garbage collected, d is empty now. 
}

混帐:https ://github.com/TastyCatFood/mistletoe

还有像这样的包:https : //pub.dartlang.org/packages/dynamic_object 它似乎覆盖了 noSuchMethod 以创建一个允许伪动态添加属性的自定义类。如果您扩展类 Function 并覆盖 noSuchMethod,我相信您可以创建一个允许您添加属性的函数对象。

一般来说,你应该避免让你的代码过于动态。Dart 分析器和你的 IDE 不支持这些 hacky 的东西。虽然,有时你需要它。

于 2016-02-18T17:56:54.960 回答