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正则表达式去掉数字中的逗号(python正则匹配逗号)
Dec 25 Python
Python smallseg分词用法实例分析
May 28 Python
python3之微信文章爬虫实例讲解
Jul 12 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 Python
Python管理Windows服务小脚本
Mar 12 Python
对Python信号处理模块signal详解
Jan 09 Python
Python绘图Matplotlib之坐标轴及刻度总结
Jun 28 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
python matplotlib库的基本使用
Sep 23 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
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
Yii2 queue的队列使用详解
2019/07/19 PHP
添加到收藏夹代码(兼容几乎所有的浏览器)
2007/01/09 Javascript
jQuery动态改变图片显示大小(修改版)的实现思路及代码
2013/12/24 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
2017/04/27 jQuery
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
python发送邮件功能实现代码
2016/07/15 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
python Pygame的具体使用讲解
2017/11/03 Python
利用Python暴力破解zip文件口令的方法详解
2017/12/21 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
解决Pycharm下面出现No R interpreter defined的问题
2018/10/29 Python
使用Python进行体育竞技分析(预测球队成绩)
2019/05/16 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
实习生体会的自我评价范文
2013/11/28 职场文书
金融管理毕业生求职信
2014/03/03 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
公司活动总结范文
2014/07/01 职场文书
教师节主题班会方案
2015/08/17 职场文书
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
redis 解决库存并发问题实现数量控制
2022/04/08 Redis