0

アップデート

私は実験的なプログラミング言語を設計していますが、問題はクロージャーを含めるか、ファーストクラスの関数を使用するかです。これを決定するには、ファーストクラス関数に対するクロージャーの利点を示す現実的なユースケース/例が必要です。2つのうちの1つを使用せずに達成できるすべてのことを達成できることは知っていますが、コードが読みやすいファーストクラス関数などのユースケースがいくつかあります(例:短い、またはいくつかのクラスに分割されていない) )。例えば:

ルビー:

[1,5,7].map{|x| x*x }
[1,'test',3].select{|x| x.kind_of? Integer}.map{|x| x.to_s }
big_array.each{ |item| puts item }

ファーストクラス関数がなければ、for ループなどを使用する必要があるため、これらの例はより冗長になります。

では、クロージャーの有用性を示すのはどのようなユースケースでしょうか? 私はファーストクラスの関数をたくさん使っていますが、クロージャーの良いユースケースを思いつくことができませんでした. クロージャの良いユースケースはありますか?

元の投稿

クロージャーがだけでなく変数にバインドする理由がわかりません。

ルビー:

x = 5
l = lambda { x }
l.call #=> 5
x = 100
l.call #=> 100

クロージャーの定義の時点で、変数に格納されている値を参照するだけでなく、変数を参照することの用途は何ですか? この例のように:

ルビー:

x = 5
l = lambda { x }
l.call #=> 5
x = 100
l.call #=> 5, not 100

クロージャーの定義の時点で、それらの変数のだけでなく、変数を参照する必要がある良いユースケースはありますか?

4

2 に答える 2

1

閉鎖の全体的なポイントは、閉鎖状態が変化する可能性があるということです。おそらく、パラメーターを隠しているため、変更されない (または変更できない) ものを閉じることは悪い形です。

次の不自然な例を C# で見てみましょう。

var sb=new StringBuilder();
int counter = 0;
var Append=(int a, string s)=>
            sb.Append(a*a + counter++, SomethingElse(s, "some constant"));

AppendStringBuilder とカウンターを閉じて、毎回SomethingElseandセレモニーを実行するのではなく、コードを介して呼び出しを振りかけることができるようにします。sb.Append内部の状態が変更できない場合、クロージャーはこの種のことにはあまり役に立ちません。

于 2010-10-18T23:49:18.303 に答える
0

私が理解していることから (私が間違っている場合は誰か助けてください)、ラムダ式内で変数を使用すると、変数 (「Foo as Widget」など) が、以下に示すように定義された New Holder(Of Widget) に変更され、変更されます。 Foo へのすべての参照を Foo.Value への参照にします。閉じた変数のホルダーは、パラメータとしてデリゲート ファクトリに渡されます。

クラスホルダー(T)
  T としての公開値

  Sub New(NewValue As T)
    値 = 新しい値
  サブ終了
クラス終了

追加のラッピング層が実際に役立つ頻度はよくわかりません。ローカル変数を値で取得する方が一般的だと思います。私自身のコードでは、ラムダをサポートするバージョンの VB にアップグレードする前に、デリゲート ファクトリを使用していました。

  Sub SetText(ByVal St As String)
    テキスト = St
  サブ終了

  ... 他の場所
    MyControl.BeginInvoke(NewInv(AddressOf SetText, someExpression ))

someExpressionは、遅延アクションが実際に実行されるときではなく、BeginInvoke 自体が実行されるときに評価されることに注意してください。また、関数の NewInv() ファミリーは 1 ~ 4 個のパラメーターのジェネリック オーバーライドをサポートしていること、および MethodInvoker ではなく Action(Of T) が必要な場合は、別の関数ファミリーを持つジェネリックな静的クラスがあることにも注意してください。

このアプローチの利点の 1 つは、編集/継続で機能することです。

于 2010-10-30T02:51:32.800 に答える