Синтаксис метода, вызывающий путаницу

#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