美文网首页
ruby的self与访问器

ruby的self与访问器

作者: spike15 | 来源:发表于2016-06-08 11:52 被阅读0次

在学习rails的过程中, 遇到了下面这样一段代码,里面的self.remember_token让我有些找不到方向。

class User < ActiveRecord::Base
  attr_accessor :remember_token

  def remember
    self.remember_token = User.new_token
    update_attribute(:remember_digest, User.digest(remember_token))
  end

  def User.new_token
    SecureRandom.urlsafe_base64
  end
end

乍看之下, self.remember_token是一个变量,还用了等号赋值。
但其实这里的是一个实例方法。

在class里定义了attr_accessor :remember_token, 而attr_accessor :remember_token等价于:

def remember_token
  @remember_token
end

def remember_token=(value)
  @remember_token = value
end

第一个是读方法(getter), 第二个是写方法(setter)
注意第二个方法remember_token=, 这里有一个=

再来看一下那行奇怪的代码, self.remember_token = User.new_token
其实就是调用了上面的setter方法, self.remember_token = (User.new_token)
这里的方法调用, 看上去就和赋值一模一样了
而之后User.digest(remember_token)中的remember_token则是调用了getter方法

这里又牵涉到self的用法, 关于self:

  • self在class内, 其指的是class本身
  • self在def内, 则表示类的实例

所以在def内, 使用self.method调用一个实例方法。
ruby贯彻了DRY, 在大部分情况下, 我们都可以不使用self, 隐式调用一个实例方法,
但是, setter方法不在此列, 也就是说setter方法需要显式调用

而这里的

  • self.remember_token = User.new_token 是一个显式调用
  • User.digest(remember_token) 是一个隐式调用

其实这里是可以使用实例变量来替代的:

def remember
  @remember_token = User.new_token
  update_attribute(:remember_digest, User.digest(@remember_token))
end

至此, 让我也对实例变量和访问器有了更全面的了解

相关文章

  • ruby的self与访问器

    在学习rails的过程中, 遇到了下面这样一段代码,里面的self.remember_token让我有些找不到方向...

  • yield_self 到 then

    yield_self的作用 ruby 在 2.5.0 引入 了的方法 Kernel#yield_self [Fea...

  • Ruby元编程笔记——4.类定义

    类定义揭秘 当前类小结 在类定义中,当前对象self就是正在定义的类。 Ruby解释器总是追踪当前类(模块)的引用...

  • iOS 最新版 CocoaPods安装的详细流程

    因为Ruby镜像服务器在国外,国内用户无法访问,所以国内用户一般都是先移除Ruby镜像,然后用国内的淘宝镜像替换 ...

  • Swift的学习日记

    1. 访问当前对象的属性,可以不用self.(建议:都不用,在编译器提示的时候再用.因为闭包时会用到self) 2...

  • loadView,viewDidLoad及viewDidUnlo

    一, loadView和viewDidload 在控制器加载view的时候,系统默认做法:访问self.view如...

  • 项目中遇到的问题及解决

    1. _btn 与 self.btn的区别 self.方法会先去调用setter方法耗资源 _btn是直接访问成员...

  • oc 中 self 、super 的使用

    self 对象方法中的 self 是当前对象,可以访问属性和方法,不能访问类方法类方法中的 self 是类在代码段...

  • self.name 和 _name的区别

    1、self.name 是访问属性;_name是访问实例变量; 2、在self.name=@"object"的时候...

  • 使用Puma部署Rails项目

    Puma是一个基于Ruby的Web Server服务器,与其他Ruby Web服务器不同的是,Puma是为速度与并...

网友评论

      本文标题:ruby的self与访问器

      本文链接:https://www.haomeiwen.com/subject/qrdjdttx.html