Andrey (azangru) wrote,
Andrey
azangru

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

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

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

    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; ему вроде подсказали решение задачи, но как-то неубедительно объяснили, почему так происходит. Почему дефолтный массив ведет себя иначе чем дефолтное число или дефолтная строка.
Subscribe

  • (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

    Error

    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.
  • 2 comments