Каковы преимущества таких гибких «самоидентификаторов» в F #? - PullRequest
20 голосов
/ 18 марта 2011

Хотя я понимаю самоидентификаторы в F #, я озадачен преимуществами такой гибкости.Почему F # не просто поддерживает this.Blah, как C #, и с этим покончено?Я предполагаю, что некоторые люди используют это, чтобы улучшить читаемость, но даже это кажется растяжкой.Итак, каковы преимущества / преимущества этой языковой функции?

Для не инициированных ниже приведен пример, который определяет собственный идентификатор для всего типа "self" и идентификатор области действия метода "this».Пример взят из статьи MSDN, указанной выше.

type MyClass2(dataIn) as self =
   let data = dataIn
   do
       self.PrintMessage()
   member this.PrintMessage() =
       printf "Creating MyClass2 with Data %d" data

Ответы [ 2 ]

17 голосов
/ 18 марта 2011

Одним небольшим преимуществом является то, что вы можете использовать их, чтобы отличить выражение объекта this от выражения того типа, который его создал:

type IExample = abstract GetAnObject : unit -> obj

type MyClass() = 
  member outer.Example1 = { new IExample with member inner.GetAnObject() = upcast inner }
  member outer.Example2 = { new IExample with member inner.GetAnObject() = upcast outer }

Потенциальная философская причина состоит в том, что оно делает его похожим нассылка this не слишком отличается от любого другого аргумента.Если вы должны быть в состоянии назвать другие аргументы (вместо того, чтобы принудительно использовать arg1, arg2 и т. Д.), То почему вы не можете назвать первый аргумент по своему усмотрению?

1 голос
/ 18 марта 2011

Единственное, что я могу придумать (и это не так уж и много), это то, что поскольку на самоидентификатор необходимо явно ссылаться при вызове метода экземпляра, возможность назвать его позволяет использовать что-то более короткое, чем слово this.Существует много (действительных или нет) желаний в языках на языках FP, на которых F # основан для краткости (иногда до такой степени, чтобы переусердствовать), что могло бы вызвать это.В конце концов, вы заметите, что это желание просвечивает в других местах в F #, где это не будет, например, в C # - обратите внимание на имена функций, такие как iteri, которые, вероятно, будут называться IterateWithIndex в C #.

...