当我开始学习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
允许我们直接引用对象的属性。但是我无法将这些点联系起来,看看它是如何在助手中使用的。我之前在控制器中看过它,我无法理解为什么我们想在那里使用它。
答案 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"