2017-02-24 307 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'软件包,将反射代码转换为静态代码,以防止抖动。 –