Ruby on rails RoR中的赋值函数(Rails)

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 并提到 当前用户=用户 是一个必须定义的赋值。这是一个奇怪的原因,在迄今为止我使用的大多数语言中,当我想要赋值时,我只使用“=”符号

我一直在网上学习本教程

在第8.2.3部分中,有一些奇怪的东西我不明白。关于这种方法:

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