如何将函数传递给函数?是VB2010中的仿函数/函数对象吗?

drT*_*drT 8 vb.net functor

我想制作一个数值积分方法,其中包含分析函数并将其整合到特定的时间间隔内.对于数值积分程序,我想在nr.com中使用一些程序.问题是它们是用C++编程的,它们使用函子将函数传递给集成方法.我怎么能在VB 2010中这样做?

我想初始化函数(即为函数y(x)= a*x + b设置a = 1,b = 0)然后将函数传递给积分方法.然后当积分方法调用函数时,它只用一个参数调用函数(即x,因为a,b已经设置)

在VB2010中执行此操作的最佳方法是什么?我想制作一个通用的集成方法,我可以传递任何单值函数和积分限制.

我刚刚开始使用VB,从我到目前为止所发现的工具看起来就像是我们的函数委托 - 为函数使用lambda表达式 - 发送指针/ adressOf - 来创建一个函数类/结构并将其提交给函数

至于现在我最倾向于创建一个功能类.但我不确定如何.F.ex. 我为每个想要集成的"uniqe函数"创建不同的类,但是当我需要在integration-function-call中指定参数类型时,如何将它们传递给集成函数?

这似乎是一个适用于许多数学运算的基本问题,所以我认为澄清这一点非常有用.

Jef*_*f B 12

很抱歉代码块较长,但我想展示lambda和匿名函数可用的不同选项.

首先,我们将创建一些基本功能来...

'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
Run Code Online (Sandbox Code Playgroud)

以及一个功能的功能.

'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
Run Code Online (Sandbox Code Playgroud)

最后,我们将使用它!

'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
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

我应该注意你可以定义一个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
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

For x = 0 To 10
    Dim answer = EvalEquationWithTwoParameters(1, 0, x, AddressOf Linear)
    'Do something
Next
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!


Bra*_*ner 4

查看delegates

您应该使用要调用的函数的签名来定义委托。“接受另一个函数”的函数应该有一个您定义的委托类型的参数。然后,您可以创建委托实例,传递addressof实际函数,并通过参数将委托实例传递给函数。

一个快速而肮脏的例子。

Public Class Test
    Public Delegate Function MyDelegate(Param1 As Integer) As Integer

    Public Function DoSomethingWithParam1(Param1 As Integer) As Integer
        Return Param1 + 1
    End Function

    Public Sub ThisFunctionTakesADelegate(f As MyDelegate)
        Dim result As Integer = f.Invoke(2)
    End Sub

    Public Sub main()
        Dim f As New MyDelegate(AddressOf DoSomethingWithParam1)

        ThisFunctionTakesADelegate(f)'pass the function "DoSomethingWithParam1" as a parameter to "ThisFunctionTakesADelegate"
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

您还应该检查LambdasAnonymous functions作为定义函数调用的替代方法,而无需专用的命名函数。