Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
a = Array.new
a[0]="x"
a[3]="y"
# а равно ["x", nil, nil, "y"]
Но, допустим, нам требуется, чтобы новые элементы получали другое значение. Тогда в качестве конкретного применения общего принципа предлагаем класс
ZArray
class ZArray < Array
def [](x)
if x > size
for i in size+1..x
self[i]=0
end
end
v = super(x)
end
def []=(x,v)
max = size
super(x,v)
if size - max > 1
(max..size-2).each do |i|
self[i] = 0
end
end
end
end
num = Zarray.new
num[1] = 1
num[2] = 4
num[5] = 25
# num равно [0, 1, 4, 0, 0, 25]
8.2. Хэши
Хэши еще называют ассоциативными массивами, словарями и т.д. Особенно хорошо эта структура данных знакома программистам на языках Perl и Java.
Массив можно представить как структуру, которая создает ассоциацию между индексом
x
y
x
Ключ хэша может иметь произвольный тип. Как следствие, хэш является не последовательной структурой данных. Мы знаем, что в массиве четвертый элемент следует за третьим. А в хэше тип ключа может быть таким, что понятия следующего и предыдущего значения не определены. По этой (и по другим) причинам в Ruby нет обозначений, наводящих на мысль о том, что пары в хэше следуют в каком-то определенном порядке.
Можно считать, что хэш — это массив со специальным индексом или некий аналог «таблицы синонимов» в базе данных, только оба поля хранятся в памяти.
Как бы вы ни представляли себе хэш, это полезный и мощный инструмент программирования.
8.2.1. Создание нового хэша
Как и в случае с классом
Array
[]
a1
c2
a1 = Hash.[]("flat",3,"curved",2)
a2 = Hash.[]("flat"=>3,"curved"=>2)
b1 = Hash["flat",3,"curved",2]
b2 = Hash["flat"=>3,"curved"=>2]
c1 = {"flat",3,"curved",2}
c2 = {"flat"=>3,"curved"=>2}
# Для a1, b1 и c1 число элементов должно быть четным.
Есть также метод
new
nil
d = Hash.new # Создать пустой хэш.
е = Hash.new(99) # Создать пустой хэш.
f = Hash.new("а"=>3) # Создать пустой хэш.
е["angled"] # 99
e.inspect # {}
f["b"] # {"а"=>3} (значением по умолчанию
# является тоже хэш).
f.inspect # {}
8.2.2. Указание значения по умолчанию для хэша
Значением по умолчанию для хэша является объект, возвращаемый вместо
nil
nil
default=
Все отсутствующие ключи указывают на один и тот же объект по умолчанию, поэтому изменение данного объекта имеет побочный эффект.
а = Hash.new("missing") # Объект по умолчанию - строка "missing".
a["hello"] # "missing"
а.default="nothing"
a["hello"] # "nothing"
a["good"] << "bye" # "nothingbye"
a.default # "nothingbye"
Имеется также специальный метод экземпляра
fetch
IndexError
Hash
fetch
а = {"flat",3,"curved",2,"angled",5}