4

トップレベルではなく、コンパイルされたコードを使用して 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;;

doFooProc メソッドでクラス foo の新しいオブジェクトを作成し、インスタンス化された foo のプロセス コマンドを呼び出すにはどうすればよいですか?

4

2 に答える 2

2

あなたはほとんど正しいですが、構文をモジュールシステムと混同しているか、他の言語を考えています。私の考慮事項を考慮してください。あなたは良いはずです!

以下のオブジェクトのメソッド内に新しい Foo を作成したいと思います。このコードは、doFooProc 定義の構文エラーを理由にコンパイルされません。

オブジェクトは小文字の「foo」、モジュールは大文字です。また、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 のメソッドが bar もインスタンス化した場合、ソース ファイル内のクラス定義の順序付けで発生する問題を回避する方法はありますか?

はい。相互に再帰的な関数とモジュールを書くのと同じように、それらを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
于 2009-02-04T18:37:03.320 に答える