6

次のように、プライベート スコープ内の関数からパラメーターを削除して、コードをクリーンアップしようとしています。

Function complicatedFunction(x as Double, param1 as Double, param2 as Double)
    ...
End Function

Function mainActionHappensHere(L as Double, U as Double ...)
    Function cleaner(x)
        cleaner = complicatedFunction(x, L, U)
    End Function
    ...
    cleaner(x)                       'Many calls to this function
    ...
End Function

これは可能ですか?外側の関数を終了する前に関数を開始しているため、コンパイラは「Expected End Function」と不平を言います。そして Google は役に立ちません :( PS 私は mainActionHappensHere() の外部で Cleaner() を定義することはできません。なぜなら、正しい L と U がそれに渡されないからです。

4

3 に答える 3

5

VBA、VB6、VB.NET のいずれにおいても、VB にはネストされた関数はありません。

スコープを VBA に限定すると、オプションは次のようになります。

  • UseGoSubは最も古い VB コマンドの 1 つであり、推奨されておらず、眉をひそめ、VB.NET で同等のアップグレードはありません。

    Function mainActionHappensHere(L as Double, U as Double ...)
        Dim ResultOfCleaner As Variant
        ...
        x = 5 : GoSub cleaner                       'Many calls to this function
        'Use ResultOfCleaner here
        ...
        x = 42 : GoSub cleaner                      'Many calls to this function
        'Use ResultOfCleaner here
        ...
        Exit Function
    
    cleaner:
        ResultOfCleaner = complicatedFunction(x, L, U)
        Return
    End Function
    
  • クロージャを手動で作成します。

    LandUをフィールドまたはプロパティとして公開するクラスを定義します。クラスをインスタンス化し、 set Land Uonceしてから、同じくCleanerそのクラスで定義されている function をcomplicatedFunction呼び出しLますU

    明らかに、これによりオーバーヘッドが発生します。

于 2014-05-12T18:30:35.987 に答える
-1

この構文を使用できます

Dim fSomeFunction As Func(Of String, Boolean) = Function(ByVal something As String) As Boolean
                                                                     Return True
                                                                 End Function
于 2019-06-14T12:30:34.763 に答える