Вот удивительное поведение какое. Допустим, хочу я создать в нем хэш (ака ассоциативный массив, ака словарь) с дефолтным значением для любого ключа.
Вот как это работает для чисел:
h1 = Hash.new(0) # дефолтное значение — 0 h1['a'] += 1 # прибавил единичку к дефолтному нулю h1 # проверяю => {"a"=>1}
Вот для строк:
h2 = Hash.new('cat') h2['a'] += '_and_dog' h2['a'] => "cat_and_dog" h2['b'] => "cat" # дефолтное значение сохранилось прежним h2 => {"a"=>"cat_and_dog"}
А вот, допустим, хочу я проделать то же самое с массивом и задаю в качестве значения по умолчанию пустой массив:
h3 = Hash.new([]) h3['a'] << 'an entry' h3['a'] => ["an entry"] h3['b'] => ["an entry"] # ОПАНЬКИ!!! Почему не дефолтное значение? h3 => {} # ФИГАСЕ!!!
Кто-то три года назад спрашивал про это на StackOverflow; ему вроде подсказали решение задачи, но как-то неубедительно объяснили, почему так происходит. Почему дефолтный массив ведет себя иначе чем дефолтное число или дефолтная строка.