Хеши идиомы хешей в Ruby?

Просто вставьте желаемое значение по умолчанию во входной тег. Никакого дополнительного кодирования JavaScript не требуется

        <input list="skills" value="DBA">

          <datalist name="skills" id="skills">

              <option value="PHP">Zend PHP</option>
              <option value="DBA">ORACLE DBA</option>
              <option value="APEX">APEX 5.1</option>
              <option value="ANGULAR">ANGULAR JS</option>

          </datalist>
34
задан Andrew Grimm 9 December 2011 в 08:09
поделиться

2 ответа

Можно передать Hash.new , функционируют блок, который выполняется для получения значения по умолчанию в случае, если запрошенное значение еще не существует:

h = Hash.new { |h, k| h[k] = Hash.new }

, Конечно, это может быть сделано рекурсивно.

РЕДАКТИРОВАНИЕ/: Ничего себе, существует статья , отвечающая на этот самый вопрос.

Ради полноты, вот решение от статьи для хешей произвольной глубины:

hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))

Кредиты переходят к Кенту от Шум Данных .

54
ответ дан Konrad Rudolph 27 November 2019 в 16:52
поделиться

Автовивификация, как ее называют, является и благословением, и проклятием. Проблема может заключаться в том, что если вы «посмотрите» на значение до того, как оно будет определено, вы застрянете с этим пустым хешем в слоте, и вам понадобится удалить его позже.

Если вы не возражаете, анархия, вы всегда можете просто заклинить в объявлениях стиля or-equals, которые позволят вам построить ожидаемую структуру при запросе:

((h ||= { })['w'] ||= { })['z']
4
ответ дан 27 November 2019 в 16:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: