Ruby on rails RoR中的赋值函数(Rails)
我一直在网上学习本教程 在第8.2.3部分中,有一些奇怪的东西我不明白。关于这种方法:Ruby on rails RoR中的赋值函数(Rails),ruby-on-rails,Ruby On Rails,我一直在网上学习本教程 在第8.2.3部分中,有一些奇怪的东西我不明白。关于这种方法: module SessionsHelper def sign_in(user) cookies.permanent[:remember_token] = user.remember_token current_user = user end end 并提到 当前用户=用户 是一个必须定义的赋值。这是一个奇怪的原因,在迄今为止我使用的大多数语言中,当我想要赋值时,我只使用“=”符号
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
current_user = user
end
end
并提到
当前用户=用户
是一个必须定义的赋值。这是一个奇怪的原因,在迄今为止我使用的大多数语言中,当我想要赋值时,我只使用“=”符号
所以他继续定义这个函数:
def current_user=(user)
@current_user = user
end
为什么他以前没用过
module SessionsHelper
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
@current_user = user
end
end
上述方法是否错误?
@current\u user
是一个实例变量。不向全世界公开裸实例变量被认为是一种很好的做法。相反,您可以为它定义getter和setter。例如,在setter中,可以进行有效性检查。或者触发回调。或者推/弹出某个状态
它更方便、安全、灵活。以几行代码为代价
此外,在ruby中,这是在语言级别强制执行的。您不能简单地访问实例变量
class Foo
def initialize
@bar = 1
end
end
puts Foo.new.@bar # raises exception
@current_user
是一个实例变量。不向全世界公开裸实例变量被认为是一种很好的做法。相反,您可以为它定义getter和setter。例如,在setter中,可以进行有效性检查。或者触发回调。或者推/弹出某个状态
它更方便、安全、灵活。以几行代码为代价
此外,在ruby中,这是在语言级别强制执行的。您不能简单地访问实例变量
class Foo
def initialize
@bar = 1
end
end
puts Foo.new.@bar # raises exception