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的汉字转GBK码实现代码
Feb 19 Python
Python内置函数的用法实例教程
Sep 08 Python
简单的Python抓taobao图片爬虫
Oct 26 Python
Python开发的实用计算器完整实例
May 10 Python
Python实现类的创建与使用方法示例
Jul 25 Python
Python中协程用法代码详解
Feb 10 Python
python设定并获取socket超时时间的方法
Jan 12 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
python3注册全局热键的实现
Mar 22 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
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
2011/10/09 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
javascript 打印页面代码
2009/03/24 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
原生JS实现pc端轮播图效果
2020/12/21 Javascript
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
python 阶乘累加和的实例
2019/02/01 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
Python绘图之柱形图绘制详解
2020/07/28 Python
如何把python项目部署到linux服务器
2020/08/26 Python
python的setattr函数实例用法
2020/12/16 Python
css3强大的动画效果animate使用说明及浏览器兼容介绍
2013/01/09 HTML / CSS
介绍一下MD5加密算法
2016/11/12 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
教育学专业毕业生的自我评价
2013/11/21 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
民事赔偿协议书
2014/11/02 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python