• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >ruby > 详解Ruby中的单件方法和单件类

详解Ruby中的单件方法和单件类

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了ruby,ruby碧玺,ruby woo口红,mac ruby woo口红,ruby教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

单件方法

Ruby允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法

示例代码

str = “just a regular string”

def str.title?
  self.upcase == self
end

str.title? # => false
str.methods.grep(/title?/) # => [:title?]
str.singleton_methods  #=> [:title?]

str.class # => String
String.title? #=> NoMethodError

</div>

另外,除了上面使用的定义方法,还可以通过Object#define_singleton_method方法来定义单件方法

单件方法与类方法

前面的笔记中有说道在Ruby中类也是对象,而类名只是常量,所以,在类上调用方法其实跟在对象上调用方法一样:

类方法的实质是: 它是一个类的单件方法,实际上,如果比较单件方法的定义和类方法的定义,会发现其实二者是一样的
 

def obj.a_singleton_method; end
def MyClass.another_class_method; end
</div>

二者均使用了def关键词做定义

def object.method
  #方法主体
end
</div>

上面的object可以是*对象的引用、常量类名或者self。

类宏attr_accessor

Ruby对象没有属性,如果希望得到一些像属性的东西,需要分别定义一个读方法和写方法(也就是java、objc中的set和get方法),最直接的可以这样:

示例代码

class MyClass
  def my_attribute=(value)
    @my_attribute =value  
  end
  def my_attribute
    @my_attribute
  end
end

obj = MyClass.new
obj.my_attribute = ‘x'
obj.my_attribute  #=> ‘x'

</div>

但是上面这种写法,如果属性众多的话就会存在Repeat Yourself的地方,这时就可以用到下面三个类宏:

  • Module#attr_reader 生成一个读方法
  • Module#attr_writer 生成一个写方法
  • Module#attr_accessor 同时生成读方法和写方法

示例代码

class MyClass
  attr_accessor :my_attribue
end
</div>

这样是不是就简洁多了呢? 当然,使用方法(读与写)跟上面的实现是一致的。

单件类

我们知道Ruby中对象的方法的查找顺序是: 先向右,再向上,其含义就是先向右找到对象的类,先在类的实例方法中尝试查找,如果没有找到,再继续顺着祖先链找。

前面一篇中有介绍过单件方法,单件方法是指那些只针对某个对象有效的方法,那么如果为一个对象定义了单件方法,那么这个单件方法的查找顺序又应该是怎样的?

class MyClass
  def my_method; end
end

obj = MyClass.new

def obj.my_singleton_method; end

</div>

首先,单件方法不会在obj中,因为obj不是一个类,其次它也不在MyClass中,那样的话所有的MyClass都应该能共享调用这个方法,也就构不成单件类了。同理,单件方法也不能在祖先链的某个位置(类似superclass: Object)中。正确的位置是在单件类中,这个类其实就是我们在irb中向对象询问它的类时(obj.class)得到的那个类,不同的是这类与普通的类还是有稍稍不同的。也可以称其为元类或本征类。

打开单件类

Ruby提供了两种方法获取单件类的引用,一种是通过传统的关键词class配合特殊的语法

法一
 

class << an_object
  # 自己的代码
end

obj = Object.new
singleton_class = class << obj
  self
end
singleton_class.class # => Class

</div>

另一个方法是,通过Object#singleton_class方法来获得单件类的引用:

法二

“abc”.singleton_class  # => #<Class: #<String:0xxxxxx>>
</div>

 
单件类的特性

  • 每个单件类只有一个实例(被称为单件类的原因),而且不能被继承
  • 单件类是一个对象的单件方法的存活所在
  • 引入单件类后的方法查找

基于上面对单件类的基本认识,引入单件类后,Ruby的方法查找方式就不应该是先从其类(普通类)开始,而是应该先从对象的单件类中开始查找,如果在单件类中没有找到想要的方法,它才会开始沿着类(普通类)开始,再到祖先链上去找。这样从单件类之后开始,一切又回到了我们在没有引入单件类时候的次序。

通过下面这个代码可以自行验证一下

class C
  def a_method
    ‘C#a_method()'
  end
end

class D < C; end

obj = D.new

</div>

打开单件类定义单件方法

class << obj
  def a_singleton_method
    ‘obj#a_singleton_method()'
  end
end

obj.singleton_class.superclass #=> D
</div>

</div>

您可能想查找下面的文章:

  • ruby迭代map的简洁写法实现原理分析
  • Ruby中访问SQL Server数据库的配置实例
  • ruby声明式语法的实现例子
  • Ruby中的Range对象学习笔记
  • Ruby中的String对象学习笔记
  • Ruby的基本语法学习总结
  • Ruby中的方法(函数)学习总结
  • Ruby中的变量学习总结
  • Ruby数组(Array)学习笔记
  • Ruby和元编程之万物皆为对象

相关文章

  • Ruby版本管理工具RVM的安装和使用教程
  • Rails link_to 详解
  • 详细解读Ruby当中的条件判断语句
  • ruby will_paginate的用法
  • 详解Ruby当中的算数运算
  • Ruby 魔法 学习笔记之一
  • Ruby on Rails中jquery_ujs组件拖慢速度的问题解决
  • Ruby简明教程之循环语句介绍
  • Rails bundle命令安装mysql gem包出错的解决方法
  • 在 Ubuntu 12.04 Server 上安装部署 Ruby on Rails 应用

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Ruby on Rails在Ping ++ 平台实现支付
    • Ruby实现命令行中查看函数源码的方法
    • 使用Ruby编写脚本进行系统管理的教程
    • Ruby中数组的一些相关使用方法
    • Ruby中的类Google Map/Reduce框架Skynet介绍
    • 用SparkR探索电商数据
    • Ruby基本的环境变量设置以及常用解释器命令介绍
    • Ruby self在不同环境的含义
    • 详解Ruby中的单件方法和单件类
    • rudy 继承 概念

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有