添加self关键字有什么区别?

时间:2012-10-02 14:08:37

标签: ruby self

当我开始学习Ruby时,我开始使用Michael Hartl的优秀Rails Tutorial。我刚刚重新阅读了本教程并注意到部分示例应用程序代码已被修改。在认证章节中,改变了两种方法:

# SessionsHelper
def sign_in(user)
  ...
  self.current_user = user
end

def sign_out
  self.current_user = nil
  ...
end

以前,省略了关键字self。但该应用程序工作。那么,如果没有破产,为什么要修理呢?添加了self的值是什么以及为什么使用它?

我理解self定义类方法而不是实例方法。在模型中,使用self允许我们直接引用对象的属性。但是我无法将这些点联系起来,看看它是如何在助手中使用的。我之前在控制器中看过它,我无法理解为什么我们想在那里使用它。

2 个答案:

答案 0 :(得分:4)

<强> [编辑]

教程的原始部分很可能是完全错误的。省略“self”接收器会导致方法为方法局部变量“current_user”赋值而没有其他影响。

我的原始答案不正确,应该被忽略(因为没有接收器就无法调用编写器方法foo=(x),其他方法也是如此。)

[以下不正确的原始答案]

使用“自我”接收器的原因很明显。

如果省略“self”,那么对于未经训练的眼睛,看起来您只是将“user”变量分配给名为“current_user”的新变量而没有其他效果。有经验的Rubyist知道如果在对象实例上有一个名为“current_user”的方法,那么它将被调用而不是仅仅创建和分配一个新变量,但这个细节很容易被忽略,特别是如果该方法是继承的或者未在当前的类定义部分。

通过明确使用“self”关键字,您明确表示您正在此对象实例上调用方法。

答案 1 :(得分:1)

class User
  attr_accessor :current_user

  def sign_in_1
    # Assigning local variable here
    current_user = "Foo"
  end

  def sign_in_2
    # Calling accessor method
    self.current_user = "Bar"
  end
end

u = User.new
u.sign_in_1
p u.current_user #=> nil
u.sign_in_2
p u.current_user #=> "Bar"