2009-02-04 2 views
4

Я пытаюсь изучить OCaml, используя скомпилированный код вместо верхнего уровня; однако большая часть примерного кода в Интернете, похоже, обращается к последнему.Создание объектов на лету в 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

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

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

Нижняя регистр "foo" для объектов, модули в верхнем регистре. Кроме того, вы должны поместить определение foo над вызывающим его объектом. Если это произойдет, вы должны получить Unbound class foo.

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

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

Поскольку у вас нет соответствующего 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 
+0

Вы совершенно правы. Я привык использовать капитализацию для имен классов на некоторые другие языки и продолжать возвращаться к этому с помощью OCaml. Благодаря! –

+0

eah. просто быть чистым. вы можете использовать эту интуицию при обращении к модулю и другим файлам (поскольку они являются неявными модулями) – nlucaroni

+0

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

2

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

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;;` 
+0

не был уверен, что это сработало с ключевым словом класса, и у него не было времени проверить прямо сейчас. верный. – nlucaroni

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