类的扩展和继承

class Fixnum
def dosome(str)
puts str
end
def abs
puts "覆盖了原有的方法"
end
end
puts 1.class
1.dosome("动态添加的方法")
1.abs#覆盖原有的方法

freeze冻结对象

class Test
attr_accessor :value
end
t=Test.new
t.value=1
a="test"
a.freeze
#a<<"1" 异常 a<<"1"或导致生成一个新的对象,a=a+"1"还是指向原有的对象
a=a+"1"
puts a
#t.freeze 冻结不能在被修改,所以下面扩展修改该对象就会报错TypeError def t.newmethod()
puts "t的新方法"
end dup=t.dup
clone=t.clone
t.value=2
puts t.value
t.newmethod
clone.newmethod#clone获取到了为t定义的方法newmethod
#dup.newmethod dup没有获得为t定义的方法newmethod
=begin
dup和clone都能复制对象的内容数据,唯一不同的是clone方法还能保留与对象相关联的方法等内容。
dup和clone都是浅复制,如果对象中还包含了对其他对象的引用,将不会复制这些包含的对象,而只是复制了它们的引用。
=end

序列化

class My_class
attr_accessor :value
end
a=My_class.new
a.value=123
#获取a的序列化字符
tempa=Marshal.dump(a)
puts tempa
#通过序列化字符重建对象
b=Marshal.load(tempa)
puts b.class
puts b.value

=begin
对象序列化方式不仅限于Marshal,还有其他方式,Marshal是Ruby内置的模块,性能还是比较出众的
=end


模块

module MyModule
def function
puts "模块对象方法"
end
def self.function
puts "模块方法"
end
end
module MyModule
def self.otherfunction
puts "模块方法2"
end
CONST1="模块的常量"
module MysubModule
CONST1="子模块的常量"
end
end
#p =MyModule.new
#p.function 模块是没有实例对象的概念的, 使用new 会抛出异常
puts MyModule.class
MyModule.function
MyModule.otherfunction
#::来引用模块中的模块或者方法,可以看出清晰的层次结构关系,而不同模块中同名的常量或方法也不会造成冲突
MyModule::function
puts MyModule::MysubModule::CONST1

加载模块(require,load,include,extend)

#load('testxml.rb', wrap) #加载testxml.rb文件
#require 'testxml' #加载testxml库,通常也是加载testxml.rb文件
=begin
load和require都是加载相应的模块文件到当前的环境中,load会无条件的加载源文件,不管之前是否加载过。
require则会检查,保证模块只被加载过一次,经常用于加载一些扩展库。
require和load加载后,被加载文件中的局部变量不会加载进来
如果传入的文件不包含路径,会在当前加载的目录下查找搜索
=end module MyModule
def method
puts "method"
end
end
class MyClass
include MyModule
#因为include作用为混入模块其作用等价于
# def method
# puts "method"
# end
end
class MyClass1
extend MyModule
#exted方法所扩展的对象取决于调用extend方法的对象,需要注意的是该处的extend,本质上等价于self.extend MyModule
#这里的代码中的self指代的是MyClass1类,所以MyModule被定义为MyClass1的类方法
# def self.method
# puts "method"
# end
end
my_class=MyClass.new
#类中使用include 模块中的方法变成 类的实例方法
my_class.method
#类中使用extend 模块中的方法变成了 类的方法
MyClass1.method
aa=""
#所有对象都可以extend模块而活的模块中的方法,因为aa变量所引用的是一个字符串对象的实例,extend所调用的对象为实例对象
#因此extend起作用的也是实例对象
aa.extend(MyModule)
aa.method
=begin
include和extend不会自动加载文件,他们只是将模块混入货扩展已有的模块或类。
include会建立一个由类到所包含模块的引用,自动添加为类的实例方法,当模块发生改变是,类中所混入的放发也会发生相应的改变
extend和inc极其相似,不过extend是用来在一个对象中引入一个模块,使得这个对象也具有这个模块的方法。 =end

Ruby类,模块1的更多相关文章

  1. Ruby类

    Ruby类 类定义 #!/usr/bin/ruby class Sample def hello puts "Hello Ruby!" end end # 使用上面的类来创建对象 ...

  2. VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

    在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10")  VB的语法,使用参数的不一定是方法,也有可能是属性 ...

  3. VBA标准模块与类模块

    大家通过之前的介绍,已知道怎么将一个空模块插入VBA的工程中.从插入模块中可以看到,模块有有两种——标准模块与类模块.类模块是含有类定义的特殊模块,包括其属性和方法的定义.在后面会有介绍与说明. 随着 ...

  4. VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)

    一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...

  5. 获取VB类模块成员函数指针(转)

    最近在做一些VB6.VBA的项目,被如何获取类模块中的函数指针这个问题所困扰,收集整理后,有2分资料值得收藏,特将关键部分留存,以备后续查找. 参照连接1:http://www.cnblogs.com ...

  6. ansible笔记(7):常用模块之系统类模块

    ansible笔记():常用模块之系统类模块 cron模块 cron模块可以帮助我们管理远程主机中的计划任务,功能相当于crontab命令. 在了解cron模块的参数之前,先写出一些计划任务的示例,示 ...

  7. ansible笔记(8):常用模块之系统类模块(二)

    ansible笔记():常用模块之系统类模块(二) user模块 user模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 此处我们介绍一些user模块 ...

  8. ansible笔记(6):常用模块之命令类模块

    ansible笔记():常用模块之命令类模块 command模块 command模块可以帮助我们在远程主机上执行命令 注意:使用command模块在远程主机中执行命令时,不会经过远程主机的shell处 ...

  9. VB-创建类模块DLL文件

    最近需要调用MSCOMM32.OCX控件,但是ABAP调用过程中发现无法同时发送多条记录,则需调整实现方式: a.创建DLL文件封装MSCOMM控件相关属性及方法 b.系统注册DLL文件 c.ABAP ...

  10. Java和Javac的使用时总提示找不到类模块的解决方案

    1.场景: 争对网上的很多文章中javac编译与java运行的文章,有很多不明确的地方,使得在合适时发现很多坑.这里给大家作下简介. 2.Javac的使用注意: javac -d ./ ./Insta ...

随机推荐

  1. linux内核分析之进程地址空间管理

    1.struct task_struct 进程内核栈是操作系统为管理每一个进程而分配的一个4k或者8k内存大小的一片内存区域,里面存放了一个进程的所有信息,它能够完整的描述一个正在执行的程序:它打开的 ...

  2. poj 3463 Sightseeing( 最短路与次短路)

    http://poj.org/problem?id=3463 Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  3. spring <form:checkboxes> tag and css class

    I have issue with: <form:checkboxes path="roles" cssClass="checkbox" items=&q ...

  4. POJ 1942 Paths on a Grid(组合数)

    http://poj.org/problem?id=1942 题意 :在一个n*m的矩形上有n*m个网格,从左下角的网格划到右上角的网格,沿着边画,只能向上或向右走,问有多少条不重复的路 . 思路 : ...

  5. poj The Clocks 高斯消元

    由于数据量不大,所以这题有很多解法. 我用的是高斯消元化为逆矩阵解决的…… 代码如下: #include<stdio.h> #include<iostream> using n ...

  6. MVC 国内架构设计

    http://www.cnblogs.com/guomingfeng/p/mvc-ef-query.html http://www.cnblogs.com/haogj/p/3127795.html

  7. ubuntu无线上网静态ip配置以及配置静态IP 之后无法正常上网的解决方案

    一. 配置无线网络的静态IP 编辑/etc/network/interfaces文件如下: auto lo wlan0 iface lo inet loopback iface wlan0 inet ...

  8. 【mysql的设计与优化专题(4)】表的垂直拆分和水平拆分

    垂直拆分 垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表 通常我们按以下原则进行垂直拆分: 把不常用的字段单独放在一张表; 把text,blob等大字段拆分出来放在附表中; 经常组合查询的 ...

  9. seek和tell的用法--获取文件内容大小(字节)

    /*获取文件中存取的数据内容的大小(字节数) ellg() 和 tellp() 这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get ...

  10. P154、面试题28:字符串的排列

    题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab.cba. 测试用例: 1)功能测试( ...