Вы не делаете то, что, как вы думаете, вы делаете.
Когда вы вызываете Hash.new, вы ссылаетесь на @max_value , как оно существует сейчас в текущей области действия ,Текущий контекст - это верхний уровень, он там не определен, поэтому вы получаете nil.
Затем вы устанавливаете переменную экземпляра для экземпляра, который также называется @max_value, но это не то же самое.
Вы, вероятно, хотите что-то вроде ... ну, на самом деле, я не могу представить ситуацию, когда этот механизм является хорошим решением для чего-либо, но это то, что вы просили, так что давайте работать с ним.
h = Hash.new{|h,k| h[k] = (h.instance_variable_set(:@max_value,
h.instance_variable_get(:@max_value) + 1))}
h.instance_variable_set :@max_value, 0
puts h[1] #=> 1
puts h[10] #=> 2
Обратите внимание, что я явно получаю / устанавливаю переменную экземпляра, связанную с `h, во всех случаях.Более многословно, но то, что вам нужно.