1

当我开始学习 Ruby 时,我是从 Michael Hartl 的优秀Rails 教程开始的。我刚刚重新访问了本教程,并注意到示例应用程序代码的部分内容已被修改。在身份验证章节中,更改了两种方法:

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

def sign_out
  self.current_user = nil
  ...
end

以前,关键字self被省略。但该应用程序有效。所以,如果它没有坏,为什么要修复它?增加了什么价值self,为什么要使用它?

我知道self定义类方法而不是实例方法。在模型中, usingself允许我们直接引用对象的属性。但我不能把这些点打成平手,看看它是如何在助手中使用的。我以前在控制器中看到过它,但我不明白我们为什么要在那里使用它。

4

2 回答 2

4

[编辑]

本教程的原始部分很可能是完全错误的。省略“self”接收器会导致方法将值分配给方法局部变量“current_user”,而不会产生其他影响。

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

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

使用“自我”接收器的原因可能是为了清楚起见。

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

通过显式使用“self”关键字,您清楚地表明您正在调用此对象实例的方法。

于 2012-10-02T14:11:57.397 回答
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"
于 2012-10-02T14:36:38.073 回答