Оператор Ruby =>

Где я могу найти объяснение того, что означает оператор => в Ruby?

Например,

class Acct < ActiveRecord::Base
  validates_confirmation_of :password, :email_address, :on => :create
end

что делает оператор => в этом случае?

Ответ 1

Символ "= > " не является оператором. Это просто синтаксическое средство для выражения того, что между двумя другими элементами существует взаимосвязь "ключевой ценности". Он используется для определения хэшей (или ассоциативных массивов, поскольку они называются на некоторых других языках, например PHP). В этом смысле, поскольку "= > " это не оператор, он ничего не делает (так как символы "[" и "]" ничего не делают, когда используются для определения массива). Если вы все еще запутались, просмотрите класс Hash Ruby и сравните его с классом Array.

Ответ 2

Синтаксис "Hash Rocket"

Символ не является оператором, просто частью синтаксиса, который используется для определения литерального объекта Hash. Его часто называют хеш-ракетой.

Обычно литеральный хэш-объект будет определен примерно так:

a = { :x => 1, :y => 2 } # same thing as: a = Hash.new; a[:x] = 1; a[:y] = 2

Он может быть передан методу, конечно:

def f(x); end; f({:x => 1, :y => 2})

Как это происходит, когда хэш передается как последний параметр метода, часть {} литерала объекта может быть отброшена:

f(:x => 1, :y => 2)

Параны также являются необязательными, поэтому мы получаем такие вещи, как:

f :x => 1:, :y => 2 # and of course...
validates_confirmation_of :password, :email_address, :on => :create

Наконец (только в современном Ruby) для конкретного случая, когда хеш-ключ является символом, вы можете записать значение :, поэтому:

f x: 1, y: 2 # not to mention...
validates_confirmation_of :password, :email_address, on: :create

Обратите внимание, что вызовы методов могут быть сделаны в определениях классов. Они выполняются как любой другой вызов метода, но во время определения. Они особенно полезны для такого пакета, как Rails, который делает много метапрограммирования для расширения языка и объектов библиотеки для своего домена приложения.

Ответ 3

Чтобы расширить принятый ответ (это не оператор), подумайте об этом в основном так же, как и запятая.

{ "foo" => "bar", "a" => "b" }

Запятая разделяет каждую пару в хэше, => разделяет ключ и значение внутри пары.