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)

    Tweeted and retweeted by developers. Dunno. Been working for me. Can't speak to excellence, but certainly lots of stimulating humiliation:

  • (C)opied from Twitter

    Don't know if this is real or not, but if it is, it's really strange that Canadian bureaucrats should be specifically instructed not to use the…

  • (no subject)

    This was a good talk. Interesting to see that SvelteKit is taking the same direction as Remix.run, by using html forms to submit data without the…

  • 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