Я сейчас подхожу к занятиям по F # после того, как узнал много о самых важных особенностях этого языка.Что ж, синтаксис определения класса не прост для понимания, но некоторые из основных понятий теперь понятны мне, а другие нет.
1) Первое, что я хотел бы знать, это просто ПРАВИЛЬНО /НЕПРАВИЛЬНО.Я понял, что классы могут быть определены двумя способами:
- Неявные классы.Эти классы имеют только один конструктор, и в первых строках класса необходимо определить, используя привязку let, все внутренние переменные, присваивая им значение.
- Явные классы.Эти классы имеют много конструкторов.Они принимают, через привязку val, неинициализированные значения.Эти значения ДОЛЖНЫ БЫТЬ ИНИЦИАЛИЗИРОВАНЫ в конструкторах.Если конструктор не может определить значение хотя бы для одной из частных переменных, определенных с помощью привязки val, компилятор разозлится.
IS IT CORRECT ???
2)У меня проблема с пониманием синтаксиса конструктора в явных классах.Рассмотрим следующее:
Вот первая версия:
(* COMPILES :) *)
type MyType =
val myval: int
val myother: int
(* Constructor *)
new (a: int, b: int) = {
myval = a;
myother = b;
}
Вот вторая версия:
(* COMPILES :) *)
type MyType =
val myval: int
val myother: int
(* Constructor *)
new (a: int, b: int) = {
myval = a (* No semicolon *)
myother = b (* No semicolon *)
}
Вот последняя версия:
(* DOES NOT COMPILE :( *)
type MyType =
val myval: int
val myother: int
(* Constructor *)
new (a: int, b: int) =
myval = a (* Using the normal indent syntax, without {} *)
myother = b (* Using the normal indent syntax, without {} *)
Я не понимаю, почему первые две версии компилируются, а третья, которая использует обычный синтаксис отступов, не делает этого.Эта проблема возникает только в конструкторах, потому что для членов я могу использовать синтаксис отступа
(* COMPILES :) *)
type MyType =
val myval: int
val myother: int
(* Constructor *)
new (a: int, b: int) = {
myval = a (* No semicolon *)
myother = b (* No semicolon *)
}
(* Indentation accepted, no {} to be inserted *)
member self.mymember =
let myvar = myval
myvar + 10
Почему новой функции (конструктору) нужны {} скобки ?????Мне это не нравится, потому что кажется, что последовательность рассматривается.Более того, мой код также компилируется, когда в {} ракетках между одной инструкцией и другой точкой с запятой не вставляется.ПОЧЕМУ ????