web-dev-qa-db-ja.com

ダートラムダ/ショートランド関数の混乱

私はまだDartにかなり慣れていないので、=>(太い矢印)の構文はまだ混乱しています(C#の背景から来ています)。

したがって、C#の太い矢印(=>)は次のように言います:goes toしたがって、例:

_Action<string> action1 = (str) => { System.Diagnostic.Debug.WriteLine("Parameter received: " + str.ToString()); }

action1("Some parameter");
_

意味:パラメータとして_action1_に送信するもの(stringにキャストできる場合)内部スコープ(in私たちの場合はDebug.WriteLine()に出力されます

しかし、ダートではそれは何か別のものです...(?)

たとえば_Future.then_

_ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then( 
   (str) => { print("Class was loaded with info: $str"),
   onError: (exp) => { print("Error occurred in class loading. Error is: $exp"); }
);
_

Dartエディターは、最初と2番目のprintが_Expected string literal for map entry key_であることを警告します。 C#の方法では、strは_Future.then_がonValueまたはonErrorを呼び出すために使用する内部コールバックによって入力されるパラメーターの名前にすぎないと思います

私は何を間違っていますか?

43
Jasper

ブロック構文または単一式構文のいずれかを選択する必要がありますが、両方を選択する必要はありません。

=>と{}を組み合わせることはできません

例を使用すると、2つのオプションは次のとおりです。

ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then( 
  (str) => print("Class was loaded with info: $str"),
  onErrro: (exp) => print("Error occurred in class loading. Error is: $exp")
);

または

ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then( 
  (str) { print("Class was loaded with info: $str"); },
  onErrro: (exp) { print("Error occurred in class loading. Error is: $exp"); }
);

どちらの場合も、それは無名関数を表現する方法にすぎません。

通常、単一の式を実行するだけの場合は、ポイントコードをより明確にするために=>構文を使用します。例:

someFunction.then( (String str) => print(str) );

または、中かっこ付きのブロック構文を使用して、より多くの作業を行うか、単一の式を使用できます。

someFunction.then( (String str) {
  str = str + "Hello World";
  print(str);
});

ただし、2つの関数作成構文を作成しているため、それらを組み合わせることはできません。

お役に立てれば。

70
Daegalus

Dartでは、=> xxx{ return xxx; }を回避するための単なるシンタックスシュガーです。したがって、次の2つの関数は同等です。

var a = (String s) => s;
var b = (String s) { return s; } ;

メソッド定義で=>を使用することもできます。

String myFunc(String s) => s;
String myFunc(String s) {
  return s;
}
40

その構文は、JavaScriptのような言語や、#がセミコロンで区切られた(param1, param2, …, paramN) => { statements }をサポートするc#でもうまく機能します。 Dartでは、太い矢印は{ return expr; }の省略表現である式のみをサポートします。
それがあなたのエラーを説明しています。中括弧(exp) => { print("Error occurred in class loading. Error is: $exp"); }を含むコードは、マップを返すことを意味するため、(param) => {"key": "value"}のようなものが表示されることが期待されます。ここで、keyは文字列リテラルです。

1
nonybrighto