2012-11-13 39 views
11

Đã xem cụm từ "Expando" được sử dụng gần đây với Dart. Nghe có vẻ thú vị. API không cung cấp nhiều đầu mối cho tôi.Tính năng Dart "Expando" là gì, nó hoạt động như thế nào?

Một hoặc hai ví dụ có thể hữu ích nhất!

(Không chắc chắn nếu điều này có liên quan, nhưng tôi lo lắng nhất cho một cách để thêm phương pháp (getters) và/hoặc các biến cho một lớp học.Hy vọng đây có thể là một chìa khóa để giải quyết vấn đề này. sử dụng phương pháp Nosuchmethod bây giờ và muốn để có thể trả về giá trị của phương pháp unfound.))

Cảm ơn trước,

_swarmii

Trả lời

10

Expandos cho phép bạn kết hợp đối tượng để các đối tượng khác. Một ví dụ rất hữu ích về điều này là một phần tử DOM HTML, mà chính nó không thể được phân loại phụ. Chúng ta hãy làm một expando cấp cao nhất để thêm một số chức năng để một yếu tố - trong trường hợp này một chữ ký chức năng được đưa ra trong báo cáo kết quả typedef:

typedef CustomFunction(int foo, String bar); 

Expando<CustomFunction> domFunctionExpando = new Expando<CustomFunction>(); 

Bây giờ sử dụng nó:

main(){ 
    // Assumes dart:html is imported 
    final myElement = new DivElement(); 

    // Use the expando on our DOM element. 
    domFunctionExpando[myElement] = someFunc; 

    // Now that we've "attached" the function to our object, 
    // we can call it like so: 
    domFunctionExpando[myElement](42, 'expandos are cool'); 
} 

void someFunc(int foo, String bar){ 
    print('Hello. $foo $bar'); 
} 
+7

Điểm khác biệt giữa bản đồ này và Bản đồ là gì? –

1

Tôi chơi với nó một chút. Đây là những gì tôi có.

import 'dart:html'; 

const String cHidden = 'hidden'; 

class ExpandoElement { 
    static final Expando<ExpandoElement> expando = 
     new Expando<ExpandoElement>("ExpandoElement.expando"); 

    final Element element; 

    const ExpandoElement._expand(this.element); 

    static Element expand(Element element) { 
    if (expando[element] == null) 
     expando[element] = new ExpandoElement._expand(element); 
    return element; 
    } 

// bool get hidden => element.hidden; // commented out to test noSuchMethod() 
    void set hidden(bool hidden) { 
    if (element.hidden = hidden) 
     element.classes.add(cHidden); 
    else 
     element.classes.remove(cHidden); 
    } 

    noSuchMethod(InvocationMirror invocation) => invocation.invokeOn(element); 
} 
final Expando<ExpandoElement> x = ExpandoElement.expando; 
Element xquery(String selector) => ExpandoElement.expand(query(selector)); 

final Element input = xquery('#input'); 

void main() { 
    input.classes.remove(cHidden); 
    assert(!input.classes.contains(cHidden)); 

    input.hidden = true; 
    assert(x[input].hidden); // Dart Editor warning here, but it's still true 
    assert(!input.classes.contains(cHidden)); // no effect 

    input.hidden = false; 
    assert(!x[input].hidden); // same warning, but we'll get input.hidden via noSuchMethod() 
    assert(!input.classes.contains(cHidden)); 

    x[input].hidden = true; 
    assert(input.hidden); // set by the setter of ExpandoElement.hidden 
    assert(input.classes.contains(cHidden)); // added by the setter 
    assert(x[input].hidden); 
    assert(x[input].classes.contains(cHidden)); // this is input.classes 

    x[input].hidden = false; 
    assert(!input.hidden); // set by the setter 
    assert(!input.classes.contains(cHidden)); // removed by the setter 
    assert(!x[input].hidden); 
    assert(!x[input].classes.contains(cHidden)); 

    // confused? 
    assert(input is Element); 
    assert(x[input] is! Element); // is not 
    assert(x[input] is ExpandoElement); 
    assert(x is Expando<ExpandoElement>); 
} 
+0

Vào ngày tôi đăng bài này, phiên bản Dart là r19425 –

4

Chỉ cần làm rõ sự khác biệt giữa expando và bản đồ: theo báo cáo trong groups, expando có tài liệu tham khảo yếu.
Điều này có nghĩa rằng một khóa có thể được thu thập rác ngay cả khi nó vẫn còn hiện diện trong expando (miễn là không có tham chiếu khác với nó).

Đối với tất cả các mục đích và mục đích khác, đó là bản đồ.

Các vấn đề liên quan