在dart中声明一个持有函数的字段的正确方法是什么?

时间:2014-12-02 06:27:18

标签: class functional-programming dart

想象一下这样一个愚蠢的类:

class ConditionalWorker{

var validityChecker= (inputs)=>true;

ConditionalWorker(this.validityChecker)

...

现在我的问题是,声明validityChecker字段的正确方法是什么?

This tutorial建议使用typedefs。但那不太实际。首先,编写许多只能使用一次的typedef是一件苦差事。其次,这些typedef会显示并污染我的IDE的自动完成。

var效果最好,使用自定义setter /构造函数参数来保持它总是特定类型,但我知道样式指南是discouraged

我可以做Function<bool>,但这只是一个更美化的变量和工作量是相同的。

这是一种耻辱,因为拥有这样的功能是完全合法的:

 bool every(bool test(E element));

其中参数是一个非常明确定义的函数,但我不能以相同的方式声明字段:

bool test(E element);

但希望有一些东西同样好,我没想到。右?d

2 个答案:

答案 0 :(得分:2)

如果Function<bool>不够具体(您还需要指定参数的数量和类型,则必须使用typedef。没有其他方法。

我不确定为什么你觉得它不实用。如果要为引用值的字段指定类型,则必须使用其中一个现有类或创建新类。引用功能的字段也是如此。

答案 1 :(得分:1)

如果您希望函数类型比Function更具体,则需要typedef

如果您不希望为每种返回类型命名typedef,则可以自己定义泛型函数类型。

typedef R function0<R>();
typedef R function1<S,R>(S arg1);
typedef R function2<S,T,R>(S arg1. T arg2);
typedef R function3<S,T,U,R>(S arg1, T arg2, U arg3);

然后你可以写:

function1<int,int> curryAdd(int x) => (int y) => x + y;

如果function0对您不利,您可以为其命名NullaryFunctionUnaryFuncytionBinaryFunctionTernaryFunction或您喜欢的任何其他名称