ключ: значение против ключа: значение в рубине? - PullRequest
6 голосов
/ 18 июня 2019

В ассоциациях мы обычно делаем a :b (belongs_to :something).Когда мы создаем хеш с символьными ключами, мы обычно делаем a: b.Сказав, что мой вопрос в чем разница между двумя синтаксисами.Также есть ли логика, чтобы запомнить, когда использовать какое соглашение?

Ответы [ 2 ]

10 голосов
/ 18 июня 2019

Это не соглашение, это синтаксис.

:something - это Symbol.

belongs_to :something - это метод, который используетсяотправлено неявному self, но без скобок.Чтобы сделать это очевидным, мы можем написать это следующим образом:

self.belongs_to(:something)

:something, таким образом, является просто аргументом, передаваемым методу belongs_to.

В Hash, мы можем использовать Symbol в качестве ключа:

hash = { :something => "hello" }

В версии 1.9 Ruby представил альтернативный синтаксис, который можно использовать, когда ключ является символом:

hash = { something: "hello" }

Обе версии эквивалентны.

1 голос
/ 18 июня 2019

Разница здесь между вызовом метода и хеш-ключом . Они очень похожи и их легко спутать, если вы не уверены, что ищете.

В вашем первом примере:

a :b

В длинном виде это:

a(:b)

Где теперь это явно аргумент (:b) к методу (a).

В другой форме все по-другому:

a: b

Где, если это часть вызова метода, подобного этому:

f a: b

Тогда это на самом деле означает:

f(a: b)

Что в полной форме:

f({ a: b })

Где это определение хеша, соответствующее стилю key: value. Здесь :a - это ключ (символ), а b - это значение (вызов переменной или метода).

Вы часто будете видеть a: :b, где у вас есть символьный ключ и значение.

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

...