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编程中time模块的使用
Nov 20 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
怎样使用Python脚本日志功能
Aug 14 Python
python验证码识别的示例代码
Sep 21 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
使用requests库制作Python爬虫
Mar 25 Python
pandas 将索引值相加的方法
Nov 15 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 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下过滤HTML代码的函数
2007/12/10 PHP
openflashchart 2.0 简单案例php版
2012/05/21 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
js传值 判断
2006/10/26 Javascript
js实现的网页颜色代码表全集
2007/07/17 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
AngularJS包括详解及示例代码
2016/08/17 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
javaScript 实现重复输出给定的字符串的常用方法小结
2020/02/20 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python 操作MySQL详解及实例
2017/04/30 Python
Python连接phoenix的方法示例
2017/09/29 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
Python tkinter 下拉日历控件代码
2020/03/04 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
使用matplotlib的pyplot模块绘图的实现示例
2020/07/12 Python
移动端html5 meta标签的神奇功效
2016/01/06 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
时尚休闲吧创业计划书
2014/01/25 职场文书
求职简历自荐信
2014/06/18 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
分析设计模式之模板方法Java实现
2021/06/23 Java/Android
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技