Ruby元编程基础学习笔记整理


Posted in Python onJuly 02, 2016

笔记一:
代码中包含变量,类和方法,统称为语言构建(language construct)。

# test.rb
class Greeting
 def initialize(text)
  @text = text
 end

 def welcome
  @text
 end
end
my_obj = Greeting.new("hello")
puts my_obj.class
puts my_obj.class.instance_methods(false) #false means not inherited
puts my_obj.instance_variables

result =>
Greeting
welcome
@text

总结:
实例方法继承于类,实例变量存在于对象本身。
类和对象都是ruby中的第一类值。

应用示例:

mongo API for ruby => Mongo::MongoClient

# testmongo.rb
require 'mongo'
require 'pp'

include Mongo

# the members of replcation-set
# test mongodb server version 2.6.0
host = "192.168.11.51"
# The port of members
# If the port is 27017 by default then otherport don't need to assignment
otherport = ""
port = otherport.length != 0 ? otherport : MongoClient::DEFAULT_PORT

opts = {:pool_size => 5, :pool_timeout => 10}
# Create a new connection
client = MongoClient.new(host, port, opts)

# puts client.class
puts client.class.constants
puts client.instance_variables
puts client.class.instance_methods(false)

分别输出

Constant, Instance Attribute, Instance Method

笔记二:动态调用
当你调用一个方法时,实际是给一个对象发送了一条消息。

class MyClass
 def my_method(args)
  args * 10
 end
end
obj = MyClass.new

puts obj.my_method(5)
puts "**"
puts obj.send(:my_method, 6)

结果:

50
**
60

可以使用object#send()取代点标记符来调用MyClass#my_method()方法:

obj.send(:my_method, 6)

send()方法第一个参数是要发送给对象的消息,可以是符号(:symbol)或字符串,其他参数会直接传递给调用的方法。
可以动态的决定调用哪个方法的技术,成为Dynamic Dispatch。

笔记三:符号和字符串的区别
1. 符号不可变,可以修改字符串中的字符。
2. 针对符号的操作更快些。
3. 通常符号用来表示事物的名字。
例如:

puts 1.send(:+, 4) => 5
String#to_sym(),String#intern() => string to symbol
String#to_s(),String#id2name() => symbol to string
"caoqing".to_sym() => :caoqing
:caoqing.to_s() => "caoqing"

动态派发中使用模式派发(pattern dispatch)的方法。

puts obj.class.instance_methods(true).delete_if{ |method_name| method_name !~ /^my/}
result => 
my_method

笔记四:动态定义
使用Module#define_method()方法定义一个方法。

class MyClass
 define_method :my_method do |args|
  args * 3
 end
end
obj = MyClass.new
puts obj.my_method(10)

结果:30

单件方法允许给单个对象增加一个方法。singleton methods

# test.rb
str = "My name is caoqing."
def str.title?
 self.upcase == self
end

puts str.title?
puts str.methods.grep(/^title?/)
puts str.singleton_methods

结果:

false
title?
title?

笔记五:
类方法的本质,类是对象,类名是常量。在类上调用方法和对象调用方法一样:

obj.my_method
Cla.class_method

Duck Typing:对象能不能响应方法,可以是普通方法或者单件方法。
类方法的实质就是他们是类的一个单件方法。

def obj.method
 # method body
end

obj可以是对象引用,常量类名或self。

类宏(Class Macro)
Ruby对象没有属性,可以使用拟态方法定义属性。
Module#attr_*()方法中的一员来定义访问器。类宏不是关键字而是方法。

Eigenclass
单件方法按照常规的方法查找在祖先链无法找到保存的地方,obj是对象不能保存,也不能存在于class内,否则所有的实例都可以共享这个方法。
对象拥有一个特有的隐藏类,称为该对象的eigenclass。
进入eigenclass作用域:

class << obj
 code
end

如果想获取eigenclass的引用,则可以在离开该作用域时返回self:

附录:
类变量,实例变量,类方法,实例方法区别
@@                            :var类变量
@                            :实例变量
self(?clas,::).method        :类方法
method                        :实例方法

# test.rb
class Foo
 @@var = "lion"
 def self.method01
  puts "cat"
  @name = "cat"
  @@var = "cat"
  puts @name
 end

 def self.method02
  puts "tiger"
  @name = "tiger"
  @@var = "tiger"
  puts @name
 end

 def self.method03
  puts "dog"
  @name = "dog"
  @@var = "dog"
  puts @name
 end

 def putsname
  puts @name
  puts @@var
 end
end

obj = Foo.new
# obj.method01   => (NoMethodError)

obj.putsname   => lion

Foo.method01
Foo.method02
Foo.method03
obj.putsname

结果:

lion
cat
cat
tiger
tiger
dog
dog

dog
Python 相关文章推荐
python中wx将图标显示在右下角的脚本代码
Mar 08 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
python将ip地址转换成整数的方法
Mar 17 Python
Python生成随机验证码的两种方法
Dec 22 Python
用Python编写简单的微博爬虫
Mar 04 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
Golang GBK转UTF-8的例子
Aug 26 Python
Python基本语法之运算符功能与用法详解
Oct 22 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
python能开发游戏吗
Jun 11 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 #Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 #Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
Jul 02 #Python
python图片验证码生成代码
Jul 02 #Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 #Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 #Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 #Python
You might like
如何过滤高亮显示非法字符
2006/10/09 PHP
聊天室php&amp;mysql(三)
2006/10/09 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
layui表格实现代码
2017/05/20 Javascript
详解jquery选择器的原理
2017/08/01 jQuery
springmvc接收jquery提交的数组数据代码分享
2017/10/28 jQuery
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
在微信小程序中保存网络图片
2019/02/12 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
跟老齐学Python之有点简约的元组
2014/09/24 Python
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
Python测试线程应用程序过程解析
2019/12/31 Python
Python代码执行时间测量模块timeit用法解析
2020/07/01 Python
python实现canny边缘检测
2020/09/14 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
解决方案设计综合面试题
2015/08/31 面试题
广告学专业应届生求职信
2013/10/01 职场文书
装配出错检讨书
2014/09/23 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
2015年社区环境卫生工作总结
2015/04/21 职场文书
薪资证明范本
2015/06/19 职场文书
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server