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代码调试的几种方法总结
Apr 15 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
python画图的函数用法以及技巧
Jun 28 Python
浅谈python图片处理Image和skimage的区别
Aug 04 Python
python中的&amp;&amp;及||的实现示例
Aug 07 Python
python画环形图的方法
Mar 25 Python
python实现学生成绩测评系统
Jun 22 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
python执行js代码的方法
May 13 Python
Python学习之异常中的finally使用详解
Mar 16 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版(5)
2006/10/09 PHP
快速配置PHPMyAdmin方法
2008/06/05 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
PHP生成唯一订单号
2015/07/05 PHP
php str_getcsv把字符串解析为数组的实现方法
2017/04/05 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
VBS通过WMI监视注册表变动的代码
2011/10/27 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
CSS3中31种选择器使用方法教程
2013/12/05 HTML / CSS
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
商务专员岗位职责
2013/11/23 职场文书
班班通项目实施方案
2014/02/25 职场文书
物业管理专业自荐信
2014/07/01 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
驻村工作简报
2015/07/20 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android