2013-05-08 70 views
2

你可以在飛鏢中的功能添加屬性?我試過這個:你可以在Dart的函數中添加屬性嗎?

void main(){ 

    fn(){ 
     //DoSomething 
    }; 

    fn.id = 1; //Exception NoSuchMethod 

} 

只有得到一個NoSuchMethod異常拋出。有沒有什麼辦法可以在運行時像javascript那樣爲函數或任何類型的對象添加屬性?

(另外它爲什麼說不這樣的方法例外,當我分配給一個屬性?)

回答

3

你不能在Function添加屬性。但是,您可以定義一個可以像函數一樣調用的Object(請參閱​​3210)。這裏有一個例子:

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你實際上是在fn叫implicite二傳手id=。那就是你得到這個錯誤的原因。

+0

謝謝,我剛剛寫了一個'IdentifiableFn'類。 – 0xor1 2013-05-08 21:12:06

1

您不能添加或刪除對象的成員。從概念上講,一個對象是一個小型結構,其中有一個指向其類描述的指針和一些用於存儲其狀態的內存。類描述定義了分配點結構的佈局。如果類描述不包含字段id(就像在你的例子中)那麼根本沒有辦法添加它。你既不能改變類的描述,也不能改變實際的實例(所以它對於額外的字段有更多的內存)。這可能很煩人(特別是對於用於動態修改其對象的Java腳本),但它爲程序員提供了一定的保證,並使其更易於優化。對象使用較少的內存,並且優化編譯器可以做出假設,否則將不成立。

有,然而,一個方法來從側面expandos

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

的git:https://github.com/TastyCatFood/mistletoe

還有一些包是這樣的:https://pub.dartlang.org/packages/dynamic_object這似乎覆蓋noSuchMethod創建自定義類允許僞動態添加屬性。如果擴展類Function並覆蓋noSuchMethod,我相信你可以創建一個允許你添加屬性的函數對象。

一般來說,您應該避免讓代碼過於動態。 Dart分析器和您的IDE不支持這些hacky的東西。雖然,有些時候你需要它。

相關問題