Я пытаюсь создать сложный тип, и мне нужно во время строительства выполнить некоторые действия.Итак, я начал писать свой код:
type public MyType =
val private myvar: int
val private myvar2: string
(* ...Some val declarations... *)
new () = {
(* The default ctor makes something *)
}
new (ctorpar: AnotherType) = {
myvar = 1;
myvar2 = "Hello";
(* Other assignments in the form var = val *)
(* Here I would like to start a cycle in order *)
for i in ctorpar.array do
(* Do something *) (* ERROR *)
}
Хорошо, при попытке поместить for или что-то еще из назначения компилятор сходит с ума.Я предполагаю следующее: Синтаксис для нового соответствует синтаксису Вычислительных выражений, или, лучше, новый является вычислительным выражением (я подразумеваю это из-за фигурных скобок и точки с запятой от одной инструкции к другой).И в этом случае, для выражений вычислений конструктора, возможна только сортировка присваиваний.
Поэтому, пожалуйста, не могли бы вы мне ответить:
1) Правильно ли сделан мой вывод?(относительно вычислительных выражений и конструктора для типов).
2) Что я должен делать, нужно ли мне помещать сформулированный набор инструкций для выполнения в конструкторе ????Ну, вы знаете, иногда необходимо выполнить действие во время построения, и оно может включать в себя все, от цикла до всех возможностей.
Но компилятор все равно злится ...
Благодаряkvd Я понял, что у меня есть возможность сделать следующее:
type public MyType =
val private myvar: int
val private myvar2: string
(* ...Some val declarations... *)
new () = {
(* The default ctor makes something *)
}
new (ctorpar: AnotherType) =
for i in ctorpar.ACollection do
(* Something *)
{
myvar = 1;
myvar2 = "Hello";
}
Ну, извините, но это не помогает мне, потому что компилятор F # говорит мне это:
ObjectКонструкторы не могут напрямую использовать try / with и try / finally до инициализации объекта.Это включает в себя конструкторы, такие как «для х в ...», которые могут разработать для использования этих конструкций.Это ограничение, наложенное Common IL.
ОК, если проблема что-то делает до инициализации объекта, и это звучит правильно, то давайте сделаем это после:
type public MyType =
val mutable private myvar: int
val mutable private myvar2: string
(* ...Some val declarations... *)
new () = {
(* The default ctor makes something *)
}
new (ctorpar: AnotherType) =
{
myvar = 1;
myvar2 = "Hello";
}
then
for i in ctorpar.ACollection do
(* Something *)
myvar <- 10
Опять разочарован неудачей:
Значение или конструктор 'myvar' не определены.
Что мне делать ????Кажется, что после того, как он не распознает элементы в моем классе, это кажется правильным, потому что это потребовало бы идентификатора, как при объявлении членов, использующих self или this ... здесь он не имеет собственной ссылки и, правильно, говорит мне: "Ты пытаешься получить то, что я не могу дать тебе !!!!!!"