Объяснение хэшей в Ruby - PullRequest
       1

Объяснение хэшей в Ruby

1 голос
/ 02 февраля 2012

Я читаю книгу Хосе Валим "Создание краевых приложений" и наткнулся на то, чего я не понимаю.Мне интересно, может ли кто-нибудь объяснить разницу в простом английском между тремя типами хэша ниже.

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

  2. Каким образом «массив» является «ключом» во втором примере.Для меня это выглядит как массив с четырьмя переменными.

  3. Каким образом третий пример представляет собой хэш с ключом "hash as key".

    Вложенный хэш

    @ cached [ключ] [префикс] [имя] [частичный]

    Простой хэш с массивом в качестве ключа

    @ cached [[ключ, префикс, имя, частичное]]

    Простой хеш с хешем в качестве ключа

    @ cached [: key => ключ,: префикс => префикс,: имя => имя,: частичное=> частичное]

Ответы [ 2 ]

6 голосов
/ 02 февраля 2012

Вложенный хэш, хорошо, вложенный хэш.В приведенном примере @cached[key][prefix][name][partial] показан «путь» к определенному значению, поэтому в этом случае хеш может выглядеть примерно так:

@cache = {
  key => {
    prefix => {
      name => {
        partial => "value"
      }
    }
  }
}

Для простого хеша с массивом в видеключ, они используют этот массив из 4 элементов в качестве одного из ключей в хэше.

@cache = {
  [key, prefix, name, partial] => "value",
  another_key => "another value"
}

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

@cache = {
  {:key => key, :prefix => prefix, :name => name, :partial => partial} => "value",
  another_key => "another value"
}

Надеюсь, это поможет!

2 голосов
/ 02 февраля 2012

Хэш просто связывает ключ объекты с значением объектов. Ключи и значения могут быть любыми.

Если объект value сам по себе является хешем, вы можете назвать его «вложенным хешем», поскольку в некотором смысле он находится внутри основного хеша.

Если объект key является массивом, то вы получите «хэш с массивом в качестве ключа».

Если объект key сам по себе является хешем, то вы получите «хеш с хешем в качестве ключа».

См. Ответ Амфэна для хорошего визуального представления этих различных случаев.

Вы должны быть немного знакомы с синтаксисом Ruby, чтобы определить различные случаи, когда вы их видите.

Например, чтобы понять @cached[[key, prefix, name, partial]], вам нужно знать, что [key, prefix, name, partial] представляет массив, поэтому то, что у вас есть, похоже на @cached[array], что означает, что массив используется в качестве ключа.

Когда вы видите что-то вроде @cached[key][prefix], вы должны знать, что оно эквивалентно (@cached[key])[prefix], поэтому объект значения (@cached[key]) - это некий объект, который реагирует на метод []. В данном случае это вложенный хеш, потому что автор сказал вам об этом, но если вы не знали этого контекста, то возможно, что он был чем-то другим.

Когда вы видите что-то вроде @cached[:key => key, :prefix => prefix, :name => name, :partial => partial], вы должны знать, что это эквивалентно @cached[{:key => key, :prefix => prefix, :name => name, :partial => partial}], что означает, что мы используем хеш в качестве ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...