この関数が実装されている意味を教えていただきたいです。
その意味(目的)はprivate.rsのコメントに書かれているのですが、ndarrayクレート外に公開しているRawData
のようなトレイトを、ndarrayのユーザーが定義した型にimpl
されるのを禁止するためです。
RawData
トレイトはpublicメソッドのトレイト境界として使われているので、publicトレイトでなければなりません。その一方でユーザーにはimpl
させたくありません。現時点のRust(1.55)ではそれを直接実現する方法は用意されていないため、以下のような裏技のような方法(?)で実現しています。
privateなモジュールprivate
を定義する。
private
モジュール内に以下を定義する。
- publicな構造体
PrivateMarker
。この構造体にはprivate
モジュールと、ndarrayクレートのルートモジュール(lib.rs
)からしかアクセスできない
private_decl!
マクロとprivate_impl!
マクロ。これらのマクロはndarrayクレート内からしかアクセスできない
RawData
のようにpublicだかユーザーにはimpl
させたくないトレイトでは以下のようにする。
private_decl!
マクロで以下のトレイトメソッドを定義する
fn __private__(&self) -> crate::private::PrivateMarker
- ndarrayクレート外からは
PrivateMarker
にアクセスできないので__private__
メソッドは実装できない。つまりクレート外でこのトレイトをimpl
することはできなくなる
ndarrayクレート内の型にRawData
のようなトレイトをimpl
するには以下のようにする。
private_impl!
マクロを使って__private__
メソッドを実装する
この関数は、宣言されてるのみで他で使われていないように見えます。
ndarrayクレート内ではprivate_impl!
マクロによって使われています(実装されています)
例:RawViewRepr
(src/data_traits.rs)
rust
1unsafe impl<A> RawData for RawViewRepr<*const A> {
2 ...
3
4 private_impl! {}
5}
これは、以下のコードに展開されます。
rust
1unsafe impl<A> RawData for RawViewRepr<*const A> {
2 ...
3
4 #[doc(hidden)]
5 fn __private__(&self) -> crate::private::PrivateMarker {
6 crate::private::PrivateMarker
7 }
8}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/14 09:50