monoruby: Hashクラスの実装
Hashクラス用のtraits
code:Rust
pub trait PartialEq<Rhs = Self>
where
Rhs: ?Sized,
{
// Required method
fn eq(&self, other: &Rhs) -> bool;
}
pub trait Eq: PartialEq { }
pub trait Hash {
// Required method
fn hash<H>(&self, state: &mut H)
where H: Hasher;
}
Rubyでは上記に対応するeql?、hashメソッドがカスタマイズ可能
ビットパターンが同じ場合は強制的に同じキーとして扱われる
Symbol, Fixnum, Float, Stringなどのhashはハードコードされておりカスタマイズできない。
String, Symbolクラスのeql?はカスタマイズできない
Fixnum, Flonumクラスもカスタマイズできないっぽい?
カスタマイズ可能にするために内部からユーザー定義メソッドを呼べるようにしておく必要がある
Rubyメソッドは例外を投げる可能性がある
code:Rust
pub trait RubyEql<E, G, R> {
fn eql(&self, other: &Self, e: &mut E, g: &mut G) -> Result<bool, R>;
}
pub trait RubyHash<E, G, R> {
fn ruby_hash<H: std::hash::Hasher>(&self, state: &mut H, e: &mut E, g: &mut G) -> Result<(), R>;
}