class ObjectSpace::WeakMap
Eine ObjectSpace::WeakMap ist eine Schlüssel-Wert-Zuordnung, die schwache Referenzen auf ihre Schlüssel und Werte speichert, sodass diese vom Garbage Collector (GC) eingesammelt werden können, wenn keine anderen Referenzen mehr auf sie verweisen.
Schlüssel in der Zuordnung werden über ihre Identität verglichen.
m = ObjectSpace::WeakMap.new key1 = "foo" val1 = Object.new m[key1] = val1 key2 = "bar" val2 = Object.new m[key2] = val2 m[key1] #=> #<Object:0x0...> m[key2] #=> #<Object:0x0...> val1 = nil # remove the other reference to value GC.start m[key1] #=> nil m.keys #=> ["bar"] key2 = nil # remove the other reference to key GC.start m[key2] #=> nil m.keys #=> []
(Beachten Sie, dass GC.start hier nur zu Demonstrationszwecken verwendet wird und möglicherweise nicht immer zu den gezeigten Ergebnissen führt.)
Siehe auch die Zuordnungsklasse ObjectSpace::WeakKeyMap, die Schlüssel nach Wert vergleicht und nur schwache Referenzen auf die Schlüssel hält.
Öffentliche Instanzmethoden
Source
static VALUE
wmap_aref(VALUE self, VALUE key)
{
VALUE obj = wmap_lookup(self, key);
return !UNDEF_P(obj) ? obj : Qnil;
}
Gibt den Wert zurück, der dem angegebenen key zugeordnet ist, falls dieser gefunden wird.
Wenn key nicht gefunden wird, wird nil zurückgegeben.
Source
static VALUE
wmap_aset(VALUE self, VALUE key, VALUE val)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
VALUE pair[2] = { key, val };
st_update(w->table, (st_data_t)pair, wmap_aset_replace, (st_data_t)pair);
RB_OBJ_WRITTEN(self, Qundef, key);
RB_OBJ_WRITTEN(self, Qundef, val);
return Qnil;
}
Ordnet dem angegebenen key den angegebenen value zu.
Wenn der angegebene key existiert, wird sein Wert durch den angegebenen value ersetzt; die Reihenfolge wird dadurch nicht beeinflusst.
Source
static VALUE
wmap_delete(VALUE self, VALUE key)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
VALUE orig_key = key;
st_data_t orig_key_data = (st_data_t)&orig_key;
st_data_t orig_val_data;
if (st_delete(w->table, &orig_key_data, &orig_val_data)) {
VALUE orig_val = *(VALUE *)orig_val_data;
rb_gc_remove_weak(self, (VALUE *)orig_key_data);
rb_gc_remove_weak(self, (VALUE *)orig_val_data);
struct weakmap_entry *entry = (struct weakmap_entry *)orig_key_data;
ruby_sized_xfree(entry, sizeof(struct weakmap_entry));
if (wmap_live_p(orig_val)) {
return orig_val;
}
}
if (rb_block_given_p()) {
return rb_yield(key);
}
else {
return Qnil;
}
}
Löscht den Eintrag für den angegebenen key und gibt seinen zugeordneten Wert zurück.
Wenn kein Block gegeben ist und key gefunden wird, wird der Eintrag gelöscht und der zugeordnete Wert zurückgegeben.
m = ObjectSpace::WeakMap.new key = "foo" m[key] = 1 m.delete(key) # => 1 m[key] # => nil
Wenn kein Block gegeben ist und key nicht gefunden wird, wird nil zurückgegeben.
Wenn ein Block gegeben ist und key gefunden wird, wird der Block ignoriert, der Eintrag gelöscht und der zugeordnete Wert zurückgegeben.
m = ObjectSpace::WeakMap.new key = "foo" m[key] = 2 m.delete(key) { |key| raise 'Will never happen'} # => 2
Wenn ein Block gegeben ist und key nicht gefunden wird, wird key an den Block übergeben und der Rückgabewert des Blocks wird zurückgegeben.
m = ObjectSpace::WeakMap.new m.delete("nosuch") { |key| "Key #{key} not found" } # => "Key nosuch not found"
Source
static VALUE
wmap_each(VALUE self)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
wmap_foreach(w, wmap_each_i, (st_data_t)0);
return self;
}
Iteriert über Schlüssel und Werte. Beachten Sie, dass im Gegensatz zu anderen Sammlungen each ohne Block nicht unterstützt wird.
Source
static VALUE
wmap_each_key(VALUE self)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
wmap_foreach(w, wmap_each_key_i, (st_data_t)0);
return self;
}
Iteriert über Schlüssel. Beachten Sie, dass im Gegensatz zu anderen Sammlungen each_key ohne Block nicht unterstützt wird.
Source
static VALUE
wmap_each_value(VALUE self)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
wmap_foreach(w, wmap_each_value_i, (st_data_t)0);
return self;
}
Iteriert über Werte. Beachten Sie, dass im Gegensatz zu anderen Sammlungen each_value ohne Block nicht unterstützt wird.
Source
static VALUE
wmap_has_key(VALUE self, VALUE key)
{
return RBOOL(!UNDEF_P(wmap_lookup(self, key)));
}
Source
static VALUE
wmap_inspect(VALUE self)
{
VALUE c = rb_class_name(CLASS_OF(self));
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
VALUE str = rb_sprintf("-<%"PRIsVALUE":%p", c, (void *)self);
wmap_foreach(w, wmap_inspect_i, (st_data_t)str);
RSTRING_PTR(str)[0] = '#';
rb_str_cat2(str, ">");
return str;
}
Gibt true zurück, wenn key ein Schlüssel in self ist, andernfalls false.
Source
static VALUE
wmap_keys(VALUE self)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
VALUE ary = rb_ary_new();
wmap_foreach(w, wmap_keys_i, (st_data_t)ary);
return ary;
}
Gibt ein neues Array zurück, das alle Schlüssel in der Zuordnung enthält.
Source
static VALUE
wmap_size(VALUE self)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
st_index_t n = st_table_size(w->table);
#if SIZEOF_ST_INDEX_T <= SIZEOF_LONG
return ULONG2NUM(n);
#else
return ULL2NUM(n);
#endif
}
Gibt die Anzahl der referenzierten Objekte zurück.
Source
static VALUE
wmap_values(VALUE self)
{
struct weakmap *w;
TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
VALUE ary = rb_ary_new();
wmap_foreach(w, wmap_values_i, (st_data_t)ary);
return ary;
}
Gibt ein neues Array zurück, das alle Werte in der Zuordnung enthält.