オンザフライでのOCamlでオブジェクトを作成します
-
21-08-2019 - |
質問
私の代わりにトップレベルのコンパイルされたコードを使用しての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;;
また、「せ」の構文は、クラス定義内で友好的であるように思えません。それはなぜですか?
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の新しいオブジェクトを作成し、呼び出して行く方法を教えてください。
解決
あなたはほとんどが正しいだが、混乱モジュールシステムとの構文、または他の言語の思考のどちらかです。私の考慮事項を取り、あなたは良いはずです!
オブジェクトのための私は新しいは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
他のヒント
二つの相互に再帰的なクラスについては、使用してキーワード
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;;`