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 のとおりです。 baseC# の 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);
}

さらに詳細が必要な場合はお知らせください。

4

2 に答える 2

3

具体的なコード スニペットを提供するために、次の例では、現在のインスタンスに名前を付けて、C# バージョンに直接対応するas thisコンストラクターで参照できるようにします (を参照する変数には任意の名前を使用できます)。this

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