2

我正在用 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

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

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

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

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

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

我也将路由构建器的 nancy 代码供参考

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);
}

如果需要任何进一步的细节,请告诉我。

4

2 回答 2

3

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

type HomeModule() as this = 
  inherit NancyModule()
  do this.Get.["/"] <- fun parameters -> this.View.["Index.html"] :> obj
于 2013-07-12T03:15:44.203 回答
2

一些评论:

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

对于这个base问题,我认为你应该使用base没有额外的引号。您可能需要添加as self到您的构造函数才能使用它,添加双引号使其成为变量名,这不会满足您的要求。

于 2013-07-12T02:10:38.013 回答