2

private_method私のモジュールのいくつかには、2 つのメソッドで特定のクラス型を実装するグローバル クラス インスタンスが含まれていますpublic_method

プログラム内MyModule.my_instance # public_methodのどこからでも利用できるようにしたいのですが、 .MyModule.my_instance # private_methodMyModule

私は次のことを試みました:

class type public_type = object
  method public_method  : int
end ;;

class type private_type = object
  method public_method  : int
  method private_method : int
end ;;

let make_private : unit -> private_type = fun () -> object
  method public_method  = 0
  method private_method = 0
end ;;

module type MY_MODULE = sig
  val my_instance : public_type
end

module MyModule : MY_MODULE = struct
  let my_instance = make_private ()
  let _           = print_int (my_instance # private_method)
end 

ただし、これによりエラーが発生します。

値が一致しません:

val my_instance : private_type

には含まれません

val my_instance : public_type

強制を手動で書くことができます:

module MyModule : MY_MODULE = struct
  let my_instance = make_private ()
  let _           = print_int (my_instance # private_method)

  let my_instance = (my_instance :> public_type)
end 

しかし、このような単純なもののためにコード サイズを 2 倍にしたくはありません。

なぜこれが起こるのか、どうすれば回避できるのかについて何か提案はありますか?

4

2 に答える 2

3

おそらく、これを解決するための最良の手法は、Garrigue によって説明されているプラ​​イベート行タイプを使用することです(「プライベート行タイプ: 名前の抽象化」; 2 番目のリンクを投稿できないので、調べてください)。これは、明示的なオブジェクト型式で使用できます。

module type MY_MODULE2 = sig
  type t = private < public_method : int; ..>
  val my_instance : t
end ;;

module MyModule2 : MY_MODULE2 = struct
  type t = private_type
  let my_instance = make_private ()
  let _           = print_int (my_instance # private_method)
end  ;;

またはオブジェクトパスを使用します(これが必要です):

module type MY_MODULE3 = sig
  type t = private #public_type
  val my_instance : t
end ;;

module MyModule3 : MY_MODULE3 = struct
  type t = private_type
  let my_instance = make_private ()
  let _           = print_int (my_instance # private_method)
end  ;;
于 2011-01-28T14:56:08.820 に答える
3

ocaml には暗黙の強制はありません。おそらく、強制をファンクターに入れる価値があります(これらの同じプロパティを持つ複数のモジュールがある場合):

module Hide(M:sig val my_instance : private_type end) : MY_MODULE =
struct
  let my_instance = (M.my_instance :> public_type)
end

module MyModule = Hide (struct
  let my_instance = make_private ()
  let _           = print_int (my_instance # private_method)
end)
于 2011-01-10T14:05:06.647 に答える