Извините за более длинные фрагменты кода, но я хотел продемонстрировать различные опции, доступные вам с лямбдами и анонимными функциями.
Сначала мы создадим несколько основных функций, с которыми можно играть ...
'Solves a basic linear equation y(x) = ax + b, given a, b, and x.
Function Linear(a As Double, b As Double, x As Double) As Double
Return a * x + b
End Function
'Return the inverse of a number (i.e. y(x) = -x)
Function Inverse(x As Double) As Double
Return -x
End Function
И функция, которая принимает функцию.
'To help differentiate the type of the parameter from the return type,
'I'm being generic with the return type. This function takes any function
'that takes a double and returns some generic type, T.
Public Function EvalEquation(Of T)(x As Double, equation As Func(Of Double, T)) As T
Return equation(x)
End Function
И, наконец, мы будем использовать ее!
'The closest thing to a functor is probably the AddressOf keyword.
For x = 0 To 10
Dim answer = EvalEquation(x, AddressOf Inverse)
'Do something
Next
Но у AddressOf есть некоторые ограничения ... EvalEquationForXожидает функцию, которая принимает только один параметр, поэтому я не могу просто использовать AddressOf, так как не могу передать дополнительные параметры.Однако я могу динамически создать функцию, которая может сделать это для меня.
For x = 0 To 10
Dim answer = EvalEquation(x, Function(x)
Dim a = 1
Dim b = 0
Return Linear(a, b, x)
End Function)
'Do something
Next
Я должен отметить, что вы можете определить Func(Of T1, T2, T3, T4,... TResult)
, чтобы вы могли создать функцию, которая могла бы принимать два параметра и использовать этовместо этого.
Public Function EvalEquationWithTwoParameters(Of T)(
a As Double, b As Double, x As Double,
equation As Func(Of Double, Double, Double, T)) As T
Return equation(a, b, x)
End Function
И используйте это так:
For x = 0 To 10
Dim answer = EvalEquationWithTwoParameters(1, 0, x, AddressOf Linear)
'Do something
Next
Надеюсь, это поможет!