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语言的12个基础知识点小结
Jul 10 Python
python操作mysql中文显示乱码的解决方法
Oct 11 Python
windows系统下Python环境搭建教程
Mar 28 Python
Python操作MongoDB数据库的方法示例
Jan 04 Python
python 处理string到hex脚本的方法
Oct 26 Python
python采集微信公众号文章
Dec 20 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
Python中免验证跳转到内容页的实例代码
Oct 23 Python
python搜索算法原理及实例讲解
Nov 18 Python
Pycharm安装python库的方法
Nov 24 Python
python 模拟登录B站的示例代码
Dec 15 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
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
PHP 实用代码收集
2010/01/22 PHP
php中将数组存到文件里的实现代码
2012/01/19 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
js实现的牛顿摆效果
2015/03/31 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
Python实现SQL注入检测插件实例代码
2019/02/02 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
国培远程培训感言
2014/03/08 职场文书
设计师求职信模板
2014/05/06 职场文书
关爱空巢老人感想
2015/08/11 职场文书