在F#的上下文中理解此关键字的C#

时间:2013-07-12 02:04:51

标签: c# c#-4.0 f# nancy c#-to-f#

我正在和F#一起尝试Nancy。它非常酷但我在F#中得不到一些东西。首先,我将写下这两个代码。

这是C#的代码

public class HomeModule : NancyModule
{
    public HomeModule()
    {
        this.Get["/"] = (parameters) => View["Index.html"];
    }
}

public class AboutModule : NancyModule
{
    public AboutModule():base("/about")
    {
        this.Get["/"] = (parameters) => "Hello About";
    }
}

这是F#的代码

type HomeModule() = 
    inherit NancyModule()
    let get = ``base``.Get
    let view = ``base``.View
    do get.["/"] <- fun parameters -> view.["Index.html"] :> obj

type AboutModule() = 
    inherit NancyModule("/about")
    let get = ``base``.Get
    do get.["/"] <- fun parameters -> "Hello About" :> obj

我已经收到的很少的东西,我放在这里以防万一有人读这个问题作为参考,然后他/她会得到它。

参数用作强制构造函数。它应该在所有私有或let类型的成员之后以及任何类型的成员之前定义。根据MSDN。 base相当于C#中的base。也可以使用base但是当我进行格式化时它会改变..

那么,为什么base更可取而不是基数。 当我试图在函数调用中调用base.View。[“Index.html”]时强制我添加私有成员,为什么?就像在C#中一样,它只是允许的。 现在这是我没有得到的东西。

在C#中我可以直接写Get [“/”]但是在F#中我需要写Get。[“/”]。意味着我必须调用另一个函数而不是属性构造函数。

即使我不知道构造函数中的“this”如何在C#内部使用,所以如果有人解释,它会很好......如果在F#中有任何等价物。

我也将路由构建器的南希代码作为参考

public class RouteBuilder : IHideObjectMembers
{
    public RouteBuilder(string method, NancyModule parentModule);

    public Func<dynamic, dynamic> this[string path] { set; }
    public Func<dynamic, dynamic> this[string path, Func<NancyContext, bool> condition] { set; }

    protected void AddRoute(string path, Func<NancyContext, bool> condition, Func<dynamic, dynamic> value);
}

如果需要进一步的详细信息,请告诉我。

2 个答案:

答案 0 :(得分:3)

为了给出具体的代码片段,以下示例使用as this命名当前实例,以便您可以在构造函数中引用它(您可以使用引用{{1}的变量的任何名称})直接对应于C#版本:

this

答案 1 :(得分:2)

一些意见:

由于你必须在F#中使用Get.["/"],问题是编译器需要区分访问器和以列表作为参数的函数(["/"] = "/"::[]

对于base问题,我认为您应该使用base而不使用额外的引号。您可能需要将as self添加到构造函数中才能使用它,添加双引号会使其成为变量名称,但这并不是您想要的。

相关问题