Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何理解ruby中的标识符?_Ruby_Variables_Syntax_Accessor - Fatal编程技术网

我应该如何理解ruby中的标识符?

我应该如何理解ruby中的标识符?,ruby,variables,syntax,accessor,Ruby,Variables,Syntax,Accessor,我正在学习Michael Hartl的RoR教程。以下是SessionHelper中的一些代码: module SessionsHelper def sign_in(user) cookies.permanent[:remember_token] = user.r

我正在学习Michael Hartl的RoR教程。以下是SessionHelper中的一些代码:

module SessionsHelper                                                       
  def sign_in(user)                                                         
    cookies.permanent[:remember_token] = user.remember_token                
    self.current_user = user                                                
  end                                                                       

  def current_user=(user)                                                   
    @current_user = user                                                    
  end                                                                       

  def current_user                                                          
    @current_user ||= User.find_by_remember_token(cookies[:remember_token]) 
  end                                                                       

  def current_user?(user)                                                   
    user == current_user                                                    
  end                                                                       

  def signed_in?                                                            
    !current_user.nil?                                                      
  end                                                                       

  def sign_out                                                              
    self.current_user = nil                                                 
    cookies.delete(:remember_token)                                         
  end                                                                       

end   
从这段代码中我有很多东西不明白

  • 在方法
    current\u user?
    中,
    current\u user
    是变量还是调用方法
    current\u user
我不明白在这种情况下如何确定当前用户的值

  • 在方法
    current\u user
    中,
    @current\u user
    是一个实例变量。它是什么的实例变量(即什么类?)
如果查看
登录(用户)
方法,可以看到
self.current\u user
被分配了对象
user
的值。但是(假设self属于UsersController类,因为
UsersController
并且在
ApplicationController
的定义中有一行包含
SessionHelper
)对于
self
对象,没有实例变量
current\u user
的定义

  • 为什么在
    current\u user=
    中我们使用
    @current\u user
    而在
    current\u user中我们只使用
    current\u user
我已经在StackOverflow上完成了先决条件搜索,但没有找到所有这些差异的好解释。我想学习的很大一部分是何时使用
@current\u user
current\u user
:current\u user
。我最熟悉C、C++、PHP、java、JavaScript。如果有类似的语言,这将帮助我更好地理解正在发生的事情

在方法current_user?中,current_user是一个变量还是一个变量 调用当前用户的方法

这就是方法,因为范围中没有该名称的词法

在方法current_user中,@current_user是一个实例变量。 它是什么的实例变量(即什么类?)

它是任何类的实例的实例变量,该类在模块
sessionhelper
中混合使用(通常与
包含sessionhelper

如果查看sign_in(user)方法,可以看到self.current_user被分配了对象的值 用户。但是(假设self属于UsersController类),因为 UsersController<应用程序控制器,在 ApplicationController有一行包含SessionHelper) 当前用户的实例变量current_user没有定义 自我客体

sign\u in
与setter方法
current\u user=
一起在本模块中定义
self.current\u user=user
将使用参数
user
self
发送消息
:current\u user=
。由于sign_in来自此模块,因此消息分派很可能会发送到此模块中定义的setter,尽管相同名称的setter可能由包含此模块的类定义,或者由包含在此模块之后的模块定义,在这种情况下,将首先在分派搜索中找到这些方法

How come in current_user=我们使用@current_user,但在 当前用户?我们只使用当前用户

当setter和getter方法(有时还有initialize)被定义时,将直接实例变量访问限制到它们被认为是一种很好的做法。在这种情况下,通过重用
current\u user?
谓词中的
current\u user
getter,我们保留了getter中
@current\u user | |=user.find\u by…
表达式的缓存或获取行为

在方法current_user?中,current_user是一个变量还是一个变量 调用当前用户的方法

这就是方法,因为范围中没有该名称的词法

在方法current_user中,@current_user是一个实例变量。 它是什么的实例变量(即什么类?)

它是任何类的实例的实例变量,该类在模块
sessionhelper
中混合使用(通常与
包含sessionhelper

如果查看sign_in(user)方法,可以看到self.current_user被分配了对象的值 用户。但是(假设self属于UsersController类),因为 UsersController<应用程序控制器,在 ApplicationController有一行包含SessionHelper) 当前用户的实例变量current_user没有定义 自我客体

sign\u in
与setter方法
current\u user=
一起在本模块中定义
self.current\u user=user
将使用参数
user
self
发送消息
:current\u user=
。由于sign_in来自此模块,因此消息分派很可能会发送到此模块中定义的setter,尽管相同名称的setter可能由包含此模块的类定义,或者由包含在此模块之后的模块定义,在这种情况下,将首先在分派搜索中找到这些方法

How come in current_user=我们使用@current_user,但在 当前用户?我们只使用当前用户


当setter和getter方法(有时还有initialize)被定义时,将直接实例变量访问限制到它们被认为是一种很好的做法。在这种情况下,通过重用
current\u user?
谓词中的
current\u user
getter,我们保留了
@current\u user | |=user.find\u by…
表达式在getter中的缓存或获取行为。

这是面向对象编程中的一个基本概念,称为。您有一个变量
@current\u user
,但您不直接使用该变量。您可以通过名为getter和setter的方法使用它。吸气剂