方法语法导致混淆

时间:2011-05-25 10:12:22

标签: 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前面有 * 。谁能解释一下呢?

谢谢

3 个答案:

答案 0 :(得分:5)

方法名称末尾的=是用于分配值的方法的语法糖。由于括号在Ruby中是可选的,因此您可以编写foo.current_user = (bar)foo.current_user = bar。请注意,后者看起来更自然。另请注意,您可以使用attr_writer :current_user

您还可以在Ruby中的方法名称中使用?!。按照惯例,前者表示要返回的布尔值,后者表示“危险”方法(例如,修改对象而不是返回副本)。

*将传递给方法的内容包装到数组中。它在调用方法时也有效,然后解包数组。

||只是逻辑或;如果第一个操作数计算为nilfalse,则返回另一个操作数。通常您会发现foo ||= "bar",这意味着foo将获得“bar”的值,除非它具有值(foo = foo || "bar")。

Ruby是一种很好的语言,有很多这样的怪癖。 Rubyist是一个值得访问的页面。

答案 1 :(得分:1)

current_user=(user)是一个允许您执行something.current_user = foo的setter。相应的getter将是current_user,看起来像

def current_user
  @current_user
end

答案 2 :(得分:0)

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