簡體   English   中英

在 Dart 中將類型化函數作為參數傳遞

[英]Pass a typed function as a parameter in Dart

我知道Function類可以作為參數傳遞給另一個函數,如下所示:

void doSomething(Function f) {
    f(123);
}

但是有沒有辦法限制函數參數的參數和返回類型?

例如,在這種情況下, f是直接在一個整數上調用的,但如果它是一個接受不同類型的函數呢?

我嘗試將它作為Function<Integer>傳遞,但 Function 不是參數類型。

有沒有其他方法可以指定作為參數傳遞的函數的簽名?

Dart v1.23 添加了一種用於編寫函數類型的新語法,該語法也可以在線運行。

void doSomething(Function(int) f) {
  f(123);
}

與函數參數語法相比,它的優勢在於您還可以將其用於變量或其他任何您想編寫類型的地方。

void doSomething(Function(int) f) {
  Function(int) g = f;
  g(123);
}

var x = <int Function(int)>[];

int Function(int) returnsAFunction() => (int x) => x + 1;
    
int Function(int) Function() functionValue = returnsAFunction;

編輯:請注意,此答案包含過時的信息。 有關更多最新信息,請參閱Irn 的回答

只是為了擴展 Randal 的答案,您的代碼可能如下所示:

typedef void IntegerArgument(int x);

void doSomething(IntegerArgument f) {
    f(123);
}

Function<int>看起來是個好主意,但問題是我們可能想要指定返回類型以及任意數量參數的類型。

以供參考。

int execute(int func(int a, int b)) => func(4, 3);

print(execute((a, b) => a + b));

這就是typedef的用途!

您可以使用函數類型參數或使用typedef

void main() {
  doSomething(xToString);
  doSomething2(xToString);
}

String xToString(int s) => 's';

typedef String XToStringFn(int s);

void doSomething(String f(int s)) {
    print('value: ${f(123)}');
}

void doSomething2(XToStringFn f) {
    print('value: ${f(123)}');
}

DartPad 示例

要在 dart 中強類型函數,請執行以下操作:

  1. 寫下Function關鍵字
Function
  1. 用它的返回類型作為前綴(例如void
void Function
  1. 用括號附加它
void Function()
  1. 將逗號分隔的參數放在括號內
void Function(int, int)
  1. 可選 - 為您的參數命名
void Function(int foo, int bar)

現實生活中的例子:

void doSomething(void Function(int arg) f) {
    f(123);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM