我正在和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);
}
如果需要进一步的详细信息,请告诉我。
答案 0 :(得分:3)
为了给出具体的代码片段,以下示例使用as this
命名当前实例,以便您可以在构造函数中引用它(您可以使用引用{{1}的变量的任何名称})直接对应于C#版本:
this
答案 1 :(得分:2)
一些意见:
由于你必须在F#中使用Get.["/"]
,问题是编译器需要区分访问器和以列表作为参数的函数(["/"] = "/"::[]
)
对于base
问题,我认为您应该使用base
而不使用额外的引号。您可能需要将as self
添加到构造函数中才能使用它,添加双引号会使其成为变量名称,但这并不是您想要的。