2013-07-12 3 views
2

Я пытаюсь Нэнси с F #. Это довольно круто, но я не мог получить несколько вещей в F #. Сначала я напишу оба кода.Понимание C# в контексте 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 

Несколько вещей, которые я уже получить, я помещаю здесь только в случае, если кто-то прочитал этот вопрос в качестве ссылки, то s/он получит его.

Параметр используется как конструктор усилий. Он должен определять после того, как личный или пусть член типа и перед любым членом типа. В соответствии с MSDN. base является эквивалентом базы в C#. Можно использовать базу также, но когда я форматировал ее, изменилось.

Итак, почему base предпочтительнее вместо базы. Когда я попытался вызвать base.View. ["Index.html"] в вызове функции, он заставил меня добавить частного участника, почему? Как и в C#, это просто разрешено. Теперь вот что я не получу.

В C# я могу напрямую написать Get ["/"], но в F # мне нужно написать Get. ["/"]. Значит, мне нужно вызвать другую функцию вместо конструктора свойств.

Даже я не знаю, как «это» использовать в конструкторе, внутренне работающем на C#, поэтому, если кто-то объяснит это, это будет здорово ... и если в 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); 
} 

Пожалуйста, дайте мне знать, если какие-либо дополнительные детали требуется.

ответ

3

Чтобы дать конкретный фрагмент кода, в следующем примере используется as this, чтобы назвать текущий экземпляр, чтобы вы могли ссылаться на него в конструкторе (вы можете использовать любое имя для переменной, ссылаясь на), которая непосредственно соответствует C# версия:

type HomeModule() as this = 
    inherit NancyModule() 
    do this.Get.["/"] <- fun parameters -> this.View.["Index.html"] :> obj 
+0

Спасибо @toman. Можете ли вы рассказать мне, почему я должен пойти на Get. [] Вместо прямого Get []. И спасибо за этот трюк. Я сократил код еще больше ... – kunjee

+1

@kunjee Синтаксис F # 'blah. [Idx]' компилируется в тот же IL, что и синтаксис C# 'blah [idx]'. –

+0

@JackP. Просто просил понять фундаментальное значение этого. Иначе я не против сдачи. когда я убиваю строки только из-за использования F # :) – kunjee

2

Некоторых комментарии:

По той причине, вы должны использовать Get.["/"] в F #, то проблема в том, что компилятор должен различать между аксессорами и функцией, которая принимает список в качестве аргумента (["/"] = "/"::[])

Для вопроса base, я думаю, вы должны использовать base без дополнительных кавычек. Возможно, вам придется добавить as self к вашему конструктору, чтобы использовать его, хотя добавление двойных кавычек делает его именем переменной, которое не делает то, что вы хотите.

+0

Можете ли вы привести мне пример кода? И ya, даже база, преобразованная в переменную, но работает отлично. – kunjee

Смежные вопросы