#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
def current_user=(user)
@current_user = user
end
def user_from_remember_token
User.authenticate_with_salt(*remember_token)
end
def remember_token
cookies.signed[:remember_token] || [nil, nil]
end
1) Меня больше всего смущает def current_user=(пользователь). Что такое = for. Я вижу, что он принимает пользовательский объект в качестве параметра, но в чем смысл знака =.
2) Не уверен, почему перед remember_token есть * . Кто-нибудь может это объяснить?
Спасибо
Ответ №1:
=
В конце имени метода — это синтаксический сахар, используемый для методов, которые присваивают значение. Поскольку круглые скобки в Ruby необязательны, вы можете написать foo.current_user = (bar)
или foo.current_user = bar
. Обратите внимание, что последнее выглядит более естественно. Также обратите внимание, что вы можете использовать attr_writer :current_user
.
Вы также можете использовать ?
и !
в именах методов в Ruby. По соглашению, первое указывает на возвращаемое логическое значение, второе указывает на «опасные» методы (например, которые изменяют объект вместо возврата копии).
*
Переносит все, что было передано методу, в массив. Это работает также при вызове метода, затем он разворачивает массив.
||
Это просто логическое или; если первый операнд принимает значение nil
or false
, будет возвращен другой. Часто вы можете встретить foo ||= "bar"
, что означает, что foo
получит значение «bar», если только оно не имеет значения ( foo = foo || "bar"
).
Ruby — отличный язык с множеством подобных особенностей. Rubyist — страница, которую стоит посетить.
Комментарии:
1.Версия TLDR
=
?
!
— это просто допустимые символы в именах методов в ruby. В них нет ничего особенного. Являются ли соглашения о ТОМ, КОГДА они используются, более важными.2.
=
,?
и!
могут использоваться в конце имени метода. Хотяirb
не жалуется при объявлении метода с именемfoo?bar
, он запомнит метод какfoo?
.3. Большое спасибо, вы действительно ответили на мой вопрос! Все еще привыкаю к ruby. Хотя я слышал об этом отличные вещи 🙂
4. Это отличный язык, довольно простой в освоении. О Ruby есть фантастическая книга, Руководство прагматичного программиста . Я настоятельно рекомендую прочитать это (ссылка документирует Ruby 1.6, и на данный момент она несколько устарела; но в книжном магазине поблизости от вас должно быть более свежее издание).
Ответ №2:
current_user=(user)
является настройщиком, который позволяет вам делать something.current_user = foo
. Соответствующий метод получения был бы current_user
и выглядел бы как
def current_user
@current_user
end
Ответ №3:
Знак = перед current_user ссылается на метод attr_writer.
Это означает
def current_user=(user)
@current_user = user
end
Для ссылки:
http://www.rubyist.net/~slagell/ruby/accessors.html
http://apidock.com/ruby/Module/attr_writer
http://ruby-doc.org/core/classes/Module.html