Ruby 2.4

ObjectSpace::WeakMap

class ObjectSpace::WeakMap

Parent:ObjectIncluded modules:Enumerable

一个ObjectSpace :: WeakMap对象持有对任何对象的引用,但这些对象可以被垃圾收集。

这个类主要由WeakRef内部使用,请lib/weakref.rb用于公共接口。

公共实例方法

显示来源

用给定的键检索弱引用的对象

static VALUE wmap_aref(VALUE self, VALUE wmap) { st_data_t data; VALUE obj; struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w if (!st_lookup(w->wmap2obj, (st_data_t)wmap, &data)) return Qnil; obj = (VALUE)data; if (!is_id_value(objspace, obj)) return Qnil; if (!is_live_object(objspace, obj)) return Qnil; return obj; }

[]=(p1, p2) Show source

从给定的键创建给定值的弱引用

static VALUE wmap_aset(VALUE self, VALUE wmap, VALUE orig) { struct weakmap *w; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w should_be_finalizable(orig should_be_finalizable(wmap define_final0(orig, w->final define_final0(wmap, w->final st_update(w->obj2wmap, (st_data_t)orig, wmap_aset_update, wmap st_insert(w->wmap2obj, (st_data_t)wmap, (st_data_t)orig return nonspecial_obj_id(orig }

each() Show source

遍历弱引用对象中的键和对象

static VALUE wmap_each(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w st_foreach(w->wmap2obj, wmap_each_i, (st_data_t)objspace return self; }

each_key() Show source

遍历弱引用对象中的键和对象

static VALUE wmap_each_key(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w st_foreach(w->wmap2obj, wmap_each_key_i, (st_data_t)objspace return self; }

each_pair() Show source

遍历弱引用对象中的键和对象

static VALUE wmap_each(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w st_foreach(w->wmap2obj, wmap_each_i, (st_data_t)objspace return self; }

each_value() Show source

遍历弱引用对象中的键和对象

static VALUE wmap_each_value(VALUE self) { struct weakmap *w; rb_objspace_t *objspace = &rb_objspace; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w st_foreach(w->wmap2obj, wmap_each_value_i, (st_data_t)objspace return self; }

include?(p1) Show source

返回true如果key已注册

static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; }

inspect() Show source

static VALUE wmap_inspect(VALUE self) { VALUE str; VALUE c = rb_class_name(CLASS_OF(self) struct weakmap *w; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w str = rb_sprintf("-<%"PRIsVALUE":%p", c, (void *)self if (w->wmap2obj) { st_foreach(w->wmap2obj, wmap_inspect_i, str } RSTRING_PTR(str)[0] = '#'; rb_str_cat2(str, ">" return str; }

key?(p1) Show source

返回true如果key已注册

static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; }

keys() Show source

遍历弱引用对象中的键和对象

static VALUE wmap_keys(VALUE self) { struct weakmap *w; struct wmap_iter_arg args; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w args.objspace = &rb_objspace; args.value = rb_ary_new( st_foreach(w->wmap2obj, wmap_keys_i, (st_data_t)&args return args.value; }

length() Show source

static VALUE wmap_size(VALUE self) { struct weakmap *w; st_index_t n; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w n = w->wmap2obj->num_entries; #if SIZEOF_ST_INDEX_T <= SIZEOF_LONG return ULONG2NUM(n #else return ULL2NUM(n #endif }

member?(p1) Show source

返回true如果key已注册

static VALUE wmap_has_key(VALUE self, VALUE key) { return NIL_P(wmap_aref(self, key)) ? Qfalse : Qtrue; }

size() Show source

static VALUE wmap_size(VALUE self) { struct weakmap *w; st_index_t n; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w n = w->wmap2obj->num_entries; #if SIZEOF_ST_INDEX_T <= SIZEOF_LONG return ULONG2NUM(n #else return ULL2NUM(n #endif }

values() Show source

迭代弱引用对象中的值和对象

static VALUE wmap_values(VALUE self) { struct weakmap *w; struct wmap_iter_arg args; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w args.objspace = &rb_objspace; args.value = rb_ary_new( st_foreach(w->wmap2obj, wmap_values_i, (st_data_t)&args return args.value; }

私有实例方法

finalize(p1) Show source

static VALUE wmap_finalize(VALUE self, VALUE objid) { st_data_t orig, wmap, data; VALUE obj, *rids, i, size; struct weakmap *w; TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w /* Get reference from object id. */ obj = obj_id_to_ref(objid /* obj is original referenced object and/or weak reference. */ orig = (st_data_t)obj; if (st_delete(w->obj2wmap, &orig, &data)) { rids = (VALUE *)data; size = *rids++; for (i = 0; i < size; ++i) { wmap = (st_data_t)rids[i]; st_delete(w->wmap2obj, &wmap, NULL } ruby_sized_xfree((VALUE *)data, (size + 1) * sizeof(VALUE) } wmap = (st_data_t)obj; if (st_delete(w->wmap2obj, &wmap, &orig)) { wmap = (st_data_t)obj; st_update(w->obj2wmap, orig, wmap_final_func, wmap } return self; }