Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
else @store[key] = [keyval.shift] end end end end def store(k,v) if @store.has_key?(k) @store[k] += [v] else @store[k] = [v] end end def [](key) @store[key] end def []=(key,value) self.store(key,value) end def to_s @store.to_s end def to_a @store.to_a end def inspect @store.inspect end def keys result=[] @store.each do |k,v| result += ([k]*v.size) end result end def values @store.values.flatten end def each @store.each {|k,v| v.each {|y| yield k,y}} end alias each_pair each def each_key self.keys.each {|k| yield k} end def each_value self.values.each {|v| yield v} end def has_key? k self.keys.include? k end def has_value? v self.values.include? v end def length self.values.size end alias size length def delete k val = @store[k] @store.delete k val end def delete k,v @store[k] -= [v] if @store[k] v end # Остальные методы опущены...end# He будет работать... для повторяющихся ключей# актуально только последнее значение.h = {1=>1, 2=>4, 3=>9, 4=>16, 2=>0}# А так будет...h = HashDup.new(1,1, 2,4, 3,9, 4,16, 2,0)k = h.keys # [4, 1, 2, 2, 3]v = h.values # [16, 1, 4, 0, 9]n = h.size # 5h.each {|k,v| puts "#{k} => #{v}"}# Печатается:# 4 => 16# 1 => 1# 2 => 4# 2 => 0# 3 => 9Но если не пользоваться литеральными хэшами, то задача решаема. В листинге 8.1 реализован класс, содержащий атрибут
@storeЧто должен возвращать метод
sizekeysПомимо стандартного метода
deletedelete_pairdelete(k, v=nil)nilДля краткости мы не стали реализовывать весь класс целиком и, честно говоря, для некоторых методов, например
invert8.3. Перечисляемые структуры в общем
Что делает набор перечисляемым? Вообще-то сам тот факт, что это набор. Модуль
Enumerableeach
