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.View.["Index.html"] を呼び出そうとすると、プライベート メンバーの追加が強制されます。なぜですか? C#のように、それは許可されました。今ここに私が得られないものがあります。
C# では Get["/"] を直接記述できますが、F# では Get.["/"] を記述する必要があります。つまり、プロパティ コンストラクターの代わりに別の関数を呼び出す必要があります。
コンストラクターでの "this" の使用が C# で内部的にどのように機能したかは私にもわかりません。
参考までにルートビルダーのナンシーコードも載せておきます
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);
}
さらに詳細が必要な場合はお知らせください。