Создание объектов на лету в OCaml - PullRequest
4 голосов
/ 04 февраля 2009

Я пытаюсь изучить OCaml, используя скомпилированный код вместо верхнего уровня; однако, большая часть примера кода в Интернете, кажется, обращается к последнему.

Я хотел бы создать новый Foo в методе объекта согласно ниже. Этот код не компилируется, ссылаясь на синтаксическую ошибку с определением doFooProc.

class bar =
object (self)
 method doFooProc = (new Foo "test")#process
end;;

class foo (param1:string)=
object (self)
 method process = Printf.printf "%s\n" "Processing!"
 initializer Printf.printf "Initializing with param = %s\n" param1
end;;

Кроме того, синтаксис «let» не выглядит дружественным в определениях классов. Почему это?

class bar =
object (self)
 method doFooProc = 
  let xxx = (new Foo "test");
  xxx#process
end;;

class foo (param1:string)=
object (self)
 method process = Printf.printf "%s\n" "Processing!"
 initializer Printf.printf "Initializing with param = %s\n" param1
end;;

Как мне создать новый объект класса foo в методе doFooProc и вызвать инстанцированную команду процесса foo?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2009

Для двух взаимно рекурсивных классов используйте ключевое слово и

class bar =
  object (self)
    method doFooProc = 
      let xxx = (new foo "test") in
      xxx#process
  end
and foo (param1:string)=
  object (self)
    method process = Printf.printf "%s\n" "Processing!"
    initializer Printf.printf "Initializing with param = %s\n" param1
    method bar = new bar
  end;;`
2 голосов
/ 04 февраля 2009

Вы в основном правы, но либо путаете синтаксис с модульной системой, либо думаете о других языках. Примите мои соображения, и вы должны быть хорошими!

Я хотел бы создать новый Foo в методе объекта в ниже. Этот код не компилируется, ссылаясь на синтаксическую ошибку с определение doFooProc.

Строчная «foo» для объектов, модули прописные. Кроме того, вы должны поместить определение foo над объектом, который его вызывает. Вы должны получить Unbound class foo, если это произойдет.

class bar =
object (self)
 method doFooProc = (new foo "test")#process
end;;

Кроме того, синтаксис «let» не выглядит дружественным в определениях классов. Почему это?

Поскольку у вас нет соответствующего in, вместо этого у вас есть точка с запятой. Тогда это будет работать. Кроме того, вы можете удалить эти лишние парены, но это не имеет значения.

class bar =
object (self)
 method doFooProc = 
  let xxx = (new Foo "test") in
  xxx#process
end;;

Если, скажем, метод в foo создан бар, есть ли способ избежать проблемы, которая возникает с упорядочение определений классов в исходный файл?

Да. Это похоже на написание взаимно рекурсивных функций и модулей, вы связываете их с ключевым словом and.

class bar =
  object (self)
    method doFooProc = (new foo "test")#process
  end

and foo (param1:string) = 
  object (self)
    method process = Printf.printf "%s\n" "Processing!"
    initializer Printf.printf "Initializing with param = %s\n" param1
  end
...