類別 ObjectSpace::WeakMap
一個 ObjectSpace::WeakMap
是一個鍵值對應,它持有其鍵和值的弱參考,因此當沒有更多參考時,它們可以被垃圾收集。
對應中的鍵透過身分進行比較。
m = ObjectSpace::WeekMap.new key1 = "foo" val1 = Object.new m[key1] = val1 key2 = "foo" 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 #=> []
(請注意,GC.start
在這裡僅用於示範目的,並不一定會產生示範結果。)
另請參閱 ObjectSpace::WeakKeyMap
對應類別,它透過值比較鍵,並僅持有鍵的弱參考。
公開實例方法
map[key] → value 按一下以切換來源
如果找到,傳回與給定 key
關聯的值。
如果找不到 key
,傳回 nil
。
static VALUE wmap_aref(VALUE self, VALUE key) { VALUE obj = wmap_lookup(self, key); return !UNDEF_P(obj) ? obj : Qnil; }
map[key] = value → value 按一下以切換來源
將給定的 value
與給定的 key
關聯。
如果給定的 key
存在,則以給定的 value
取代其值;順序不受影響。
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 nonspecial_obj_id(val); }
delete(key) → value or nil 按一下以切換來源
delete(key) {|key| ... } → object
刪除給定 key
的項目並傳回其關聯值。
如果未提供區塊且找到 key
,則刪除該項目並傳回關聯值
m = ObjectSpace::WeakMap.new key = "foo" m[key] = 1 m.delete(key) # => 1 m[key] # => nil
如果未提供區塊且未找到 key
,則傳回 nil
。
如果提供了區塊且找到 key
,則忽略區塊、刪除項目並傳回關聯值
m = ObjectSpace::WeakMap.new key = "foo" m[key] = 2 m.delete(key) { |key| raise 'Will never happen'} # => 2
如果提供了區塊且未找到 key
,則將 key
傳遞給區塊並傳回區塊的傳回值
m = ObjectSpace::WeakMap.new m.delete("nosuch") { |key| "Key #{key} not found" } # => "Key nosuch not found"
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); wmap_free_entry((VALUE *)orig_key_data, (VALUE *)orig_val_data); if (wmap_live_p(orig_val)) { return orig_val; } } if (rb_block_given_p()) { return rb_yield(key); } else { return Qnil; } }
each {|key, val| ... } → self 按一下以切換來源
遍歷鍵和值。請注意,與其他集合不同,不支援沒有區塊的 each
。
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; }
別名為:each_pair
each_key {|key| ... } → self 按一下以切換來源
遍歷鍵。請注意,與其他集合不同,不支援沒有區塊的 each_key
。
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; }
each_pair
別名為:each
each_value {|val| ... } → self 按一下以切換原始碼
遍歷值。請注意,與其他集合不同,不支援沒有區塊的 each_value
。
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; }
inspect() 按一下以切換原始碼
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; }
keys → new_array 按一下以切換原始碼
傳回一個新的 Array
,其中包含映射中的所有鍵。
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; }
length
別名為:size
member?
別名為:include?
size → number 按一下以切換原始碼
傳回參照物件的數量
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 }
別名為:length
values → new_array 按一下以切換原始碼
傳回一個新的 Array
,其中包含映射中的所有值。
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; }