Andrey (azangru) wrote,

А нет ли, совершенно случайно, среди читателей сего людей, понимающих Ruby?

Вот удивительное поведение какое. Допустим, хочу я создать в нем хэш (ака ассоциативный массив, ака словарь) с дефолтным значением для любого ключа.

Вот как это работает для чисел:

    h1 =        # дефолтное значение — 0
    h1['a'] += 1           # прибавил единичку к дефолтному нулю
    h1                      # проверяю    
      => {"a"=>1} 

Вот для строк:
    h2 ='cat')
    h2['a'] += '_and_dog'
      => "cat_and_dog"
      => "cat"                   # дефолтное значение сохранилось прежним
      => {"a"=>"cat_and_dog"} 

А вот, допустим, хочу я проделать то же самое с массивом и задаю в качестве значения по умолчанию пустой массив:

    h3 =[])
    h3['a'] << 'an entry'
      => ["an entry"]
      => ["an entry"]     # ОПАНЬКИ!!! Почему не дефолтное значение?
      => {}               # ФИГАСЕ!!! 

Кто-то три года назад спрашивал про это на StackOverflow; ему вроде подсказали решение задачи, но как-то неубедительно объяснили, почему так происходит. Почему дефолтный массив ведет себя иначе чем дефолтное число или дефолтная строка.

  • (no subject)

    I'm listening to The Ickabog, by J.K. Rowling and read, with much gusto, by Stephen Fry. What started like a nice children's tale not dissimilar from…

  • (no subject)

    From today's questions to the Prime Minister: Mr Speaker, today, millions of Uyghur people in China live in fear under a cruel regime. The BBC,…

  • (no subject)

    There's a strange tendency out there for tech podcasters not to be good programmers themselves. There are exceptions, of course. The googlers at…

  • Post a new comment


    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.