2017-02-24 52 views
1

嘿,我正在尋找一個函數,它將盡可能完整地將動態變量輸出到Dart語言的控制檯。如何以Dart語言完全轉儲/打印變量到控制檯?

PHP例如我會使用var_dump()爲了獲得有關變量的所有信息。

的JavaScript我會做下列之一:

1)轉換對象JSON和打印的console.log(JSON.stringify(OBJ))

2)或自定義函數像這樣的:

function dump(arr,level) { 
    var dumped_text = ""; 
    if(!level) level = 0; 

    //The padding given at the beginning of the line. 
    var level_padding = ""; 
    for(var j=0;j<level+1;j++) level_padding += " "; 

    if(typeof(arr) == 'object') { //Array/Hashes/Objects 
    for(var item in arr) { 
    var value = arr[item]; 

    if(typeof(value) == 'object') { //If it is an array, 
    dumped_text += level_padding + "'" + item + "' ...\n"; 
    dumped_text += dump(value,level+1); 
    } else { 
    dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n"; 
    } 
    } 
    } else { //Stings/Chars/Numbers etc. 
    dumped_text = "===>"+arr+"<===("+typeof(arr)+")"; 
    } 
    return dumped_text; 
} 

但是在飛鏢如果我做print(variable)我得到這樣的事情Instance of 'FooBarObject'。我不能將對象轉換爲JSON,因爲這不適用於所有對象。

所以我的詳細問題:

是其中在鏢的功能或自定義功能,其可以打印具有未知類型(對象,陣列等),包括所有的(公共)性質的變量以及嵌套的對象和變量到我的控制檯?或者哪個功能最接近這個願望?

回答

5

沒有內置函數可以產生這樣的輸出。

print(variable)打印variable.toString()Instance of 'FooBarObject'是默認實現。您可以在自定義類中覆蓋它並打印不同的東西。

您可以使用反射(https://www.dartlang.org/articles/libraries/reflection-with-mirrors)自己構建函數,調查實例的各種屬性並按照需要打印它。 幾乎沒有限制,你可以做什麼和調試的目的,這絕對是一個很好的選擇。

對於生產Web應用程序,應該避免它,因爲它嚴重限制了樹形抖動,並且會導致構建輸出大小顯着增加。 顫振(手機)根本不支持反射。

您也可以使用其中一個JSON序列化軟件包,它可以輕鬆地將序列化添加到自定義類,然後打印序列化的值。 例如

我認爲有其他人,但我不知道(DIS)的優勢,因爲我平時使用https://pub.dartlang.org/packages/source_gen

+1

DSON包裝推出自己的作品相當不錯對於我來說,如果我嘗試使用反射自定義解決方案,我會在這裏發佈感謝。 – Blackbam

+1

有很多關於反射的問題。他們大多數仍然應該工作。反思並沒有改變那麼多。如果您想在Web應用程序的生產環境中使用反射,還可以使用'reflectable'軟件包,將反射代碼轉換爲靜態代碼,以防止抖動。 –