name=
deff
数组操作
unshift 想数组头部添加元素
push 向数组尾部添加元素
<<想数组尾部添加一个元素
array.unshift("abc")
array<<"abc"
shift 向数组头部删除
pop 从数组尾部删除
array[n,m] 截取数组从n开始,长度为m的元素列
array[n..m]截取从n开始,m为止的元素列
array[n...m] 截取从n开始到m为止,但不包括m的元素列
方法参数默认值,直接后面加=变量即可,多个参数用(,)
def Name (name="Jack",aget=20)
xxx
end
Ruby变量
局部变量 var 仅在定义类、方法和模块内有效
全局变量 $var 全局变量会引起各模块间高耦合,应避免使用
实例变量和类变量区别
实例变量是每个具体的对象自有的数据,而类变量是该类的所有对象(实例)所共享的。
实例变量若引用尚未被初始化的实例变量的话,其值为nil。
【类变量】被一个类的所有实例对象共享,也可以被类方法访问到。类变量名以‘@@’,开始,
类变量是私有的,在类外无法直接访问,你只能通过实例方法和类方法去访问它。
构造函数
class abc
def initialize name,age
@name=name
@age=age
end
end
对象内置读写属性
attr_reader :name,:color 声明只读属性
attr_writer :color 声明只写属性
attr_accessor :company 声明读写属性
attr :weight,false 声明只读属性
attr :weight,true 声明只写属性
访问作用域
public 任何地方都可访问
private 只能被其他方法调用,不能显式通过类对象调用
protected 类似于private,但可以被显式调用
有两种方式使用
1.直接声明,控制符后的所有方法都采用该控制符
2.public :method1,:method2 #类似格式声明
代码块
{
xxx
}
或
do
xxx
end
yield用法
def go()
yield @name,@*** #yield可在调用时被代码块替换
end
p.go{
|name,***|
puts "#{name}"
puts "#{***}"
}
tips:如传入参数少于代码块定义的参数个数,则未传递自动转换为nil,若多于,则最后一个转为数组
迭代器
each——连续访问集合的所有元素
collect—-从集合中获得各个元素传递给block,block返回的结果生成新的集合。
map——-同collect。
inject——遍历集合中的各个元素,将各个元素累积成返回一个值。
类的继承 <
class Subclass < ParentClass
注意<<用来声明多行字符串
info=<a
b
c
deff
Ruby不支持重载(方法名相同,参数不同)
super关键字调用基类的构造函数
基类中
def initialize name,***
@name=name
@***=***
end
派生类中
def initialize name,***
super speed,name
end
调用模块中的类
module abc
class xyz
end
end
test=abc::xyz.new
include 加载模块
extend用来在一个对象中引入一个模块
tips:include和extend区别
include使得module的方法被类实例使用;
extend使得module的方法被类本身使用。
意思是include进来的一定要实例化才能使用模块内的function,而extend则不需实例化,也可以直接使用。
load 加载扩展名为rb的文件,且得是全路径
require 不仅可加载ruby文件,还可以加载其他语言编写的文件
tips:require可反复使用,但最多加载一次,load可加载多次
alias 定义别名
undef 释放定义实例
defined? 判断是否定义
tips:defined?返回值会根据对象不同而不同,如对yield,则返回yield,对method则返回method。其他还有很多不一一类举了
BEGIN END块:BEGIN先于任何语句执行,END结束前执行。
总是按BEGIN->END的顺序执行,且BEGIN按加载顺序执行,END按加载的相反顺序执行。
at_exit块和END类似,at_exit执行时间晚于END,执行顺序为加载的反序
method_missing方法用于处理搜索不到方法的错误
def method_missing sym
puts "#{sym.to_s} doesn't exist"
end
def self.method_missing sym
puts "#{sym.to_s} doesn't exit"
end
method_missing是实例的method_missing, self.method_missing是类的方法
proc对象,类似于匿名函数,使用.call方法执行块并返回结果
在参数前加&,这个形参就被当做Proc对象处理
def foo &p
a=p
end
a=foo{puts "something"} #function #foo返回一个Proc对象
a.call #调用Proc对象的call方法
eval让解释器解释执行某段代码,而不是当做字符串
method="def run; puts 'something';end"
eval(method)
run
Ruby常见异常
RuntimeError raise方法抛出的默认异常
NoMethodError 对象找不到对应方法
NameError 解释器碰到一个不能解析为变量或方法名的标示符
IOError 当Ruby读关闭的流,写只读的流,等
Errono::error 与文件IO相关的一组错误
TypeError 方法介绍到不能处理的参数
ArgumentError 传递参数的数目出错
rescue
puts "#{$!.to_s} #{$@.to_s}"
raise 抛出异常
raise ArgumentError,"some exception"
异常类,必须从Exception继承
class MyExceptionend
字符串操作
+ 合并多个字符串
puts "www"+"sohu"+".com"
<<末尾增加字符串
cn="China"
cn<<"is china'
#{}添加字符串
str=china
cn="{str}.com"
str.replace替换变量
str.replace("")
capitalize 首字母大写
upcase 全部大写
downcase 全部小写
swapcase 大写变小写,小写变大写
strip 去掉首尾空格
lstrip 去掉左边空格
rstrip 去掉右边空格
chop 删除字符串中最后一个字符
chomp 删除最后的换行符
reverse 颠倒字符顺序
[]方法获取字符的ASCII码索引号,从左从0开始计数
str="abcd"
puts str[3] 获取字符d的ascii码
puts str[3].chr 获取字符
正则表达式
/a/ 匹配a
/\?/ 匹配特殊字符
. 任意字符
/[ab]c/ 匹配ac和bc
/[^a-zA-Z0-9]/ ^表示匹配不在该范围内
/[\d]/ 匹配数字
/[\w]/ 匹配任意字母,数字或者_
/[\s]/ 匹配空白字符,包括空格,tab和换行
? 0或1个字符
* 0或多个字符
+ 1或多个字符
/\d{3}/ 匹配3个数字
/\d{1,10}/ 匹配1-10个数字
/\d{3,}/ 匹配3个以上数字
/([A-Z]\d){5}/ 首位是大写字母,后面4位是数字的字符串
match方法使用正则表达式,以下是类似的,match是String类和Regexp类的实例方法
if /Hello*/.match("Hello Wold")
puts "matched"
end
if "Hello World".match(/Hello*/)
puts "matched"
end
也可以使用=~,和Perl里面差不多
$1,$2,$3可以捕获子匹配
时间类 Time
year,month,day,hour,min,sec,usec(微秒)
mktime,local创建一个Time对象
time1=Time.mktime(2011,7,31,11,13,20)
gem使用GMT或UTC时区,和mktime,local类似
t.to_a将时间转换为相对应的数组
t.wday 一星期第几天
t.mday 一月的第几天
t.yday 一年的第几天
strftime格式化输出日期
%a 星期几缩写
%A 星期几完整
%b 月缩写
%B 月完整
%c 相当于 %a%b%d%H:%M:%S%Y
%d 一月中的几天(01-31)
%e 一月中的几天
%H 24小时制(00-23)
%I 12小时制(1-12)
%m 月份(1-12)
%M 分钟(00-59)
%p AM或PM
%S 秒(00-59)
%w 一星期中的几天(周日为0)
%x 等于%m%d%y
t.Time.now
puts t.strftime("%c")
创建线程
thread=Thread.new do
xxx
end
thread.start/fork 创建线程和new相同
thread.current 返回当前线程
thread.join 挂起当前线程
thread.pass 暂停线程,
thread.exit/kill 停止线程
sleep 5 暂停线程几秒
线程状态
sleep sleep状态或等待IO
run 正在运行
aborting 被取消
false 正常终止
nil 非正常终止
thread.list 返回存货状态线程
thread.main 返回一个引用
thread.current 返回当前线程
线程同步与锁机制
Mutex库,synchronize方法
sizedqueue类与queue类
文件操作
Filestat类
filepath="/tmp/aa"
data=File.stat(filepath)
data.uid uid
data.gic gid
File.chown(uid,gid,filepath) 修改uidgid
File.chmod(01522.filepath) 修改文件权限
File.stat(filepath).mode 查看文件权限
File.mtime/atime/ctime(filepath) 获取文件时间戳
File.utime(Time.now,Time.now,filepath) 修改文件的时间戳
FileTest类
FileTest.exist?(filepath) 判断文件是否存在
FileTest.zero?(filepath) 判断文件是否为0
FileTest.size?(fpath) 获取文件大小
打开文件
File.new(fpath) 只读打开文件,File.open类似
File.new(fpath,"r") 同上
r 只读模式
r+ 读写模式,文件指针在开始处
w 只写模式,打开文件会清空,然后写入。若不存在,则创建文件
w+ 读写模式,其他同上,注意与r+的区别
a 追加模式,文件指针在结尾,若不存在,则创建
a+ 读/追加模式,文件指针在末尾,文件若不存在则创建
b 二进制方式打开,适合于DOS和Windos
f.close 关闭文件
f.close_read 关闭只读模式打开的文件,其他情况会出错
f.close_write 关闭只写模式打开的文件,其他情况会出错
读取文件,有点类似于c
read(length,buf)
文件指针方法
pos 获取文件指针位置
pos= 设置文件指针位置
rewind 将文件指针移动到文件开始位置
lineno 返回当前指针所在行
lineno= 将指针移到指定行
file.pos=20 移到20行
file.readchar 读取一个字符
file.readline 读取行,读到末尾会EOFError
file.readlines 一次读取所有行,并保存在数组里
f=File.new filepath
f.readlines.each do |value|
puts value
end
File.gets 与readline类似,当读到末尾是nil,而不会报错
while value=file.gets
puts value
end
迭代器 each_line 和each
file.each_line do |value|
puts value
end
f.each do |value|
puts value
end
each_byte 按字节迭代
还可用IO类的foreach方法,优点是不需要打开文件
IO.foreach filepath do |line|
puts line
end
写入文件
print 一行或多行写入文件,且不换行,可通过设置 $\ 来增加换行
puts 一行或多行写入文件,自动换行
putc 写入一个字符
write 一行字符串写入文件
删除文件
delete
unlink
rename重命名文件
dirname获取目录名
basename获取文件名
tips,basename后提供了第二个参数,制定了文件扩展名,则获取到的文件名不具有扩展名
expand_path获取绝对路径
join根据提供字符生成新路径
File.join("Ruby","learning","test.txt")
pwd,getwd 获取当前目录
chdir改变当前目录
遍历目录
Dir.foreach Dir.pwd do |entry|
puts entry
end
dir.each do |value|
puts value
end
Dir.entries方法,返回文件名数组
list=Dir.entries Dir.getwd
list.each do|value|
puts value
end
delete,rmdir,unlink 删除指定目录,成功返回0,否则生成Errno::ENOENT或Errno::ENOTEMPTY
connect连接数据库
drh(driver handle) 驱动句柄,对应于DBD,drh封装了对数据库的访问
dbh(database handle) dbh表示数据库句柄,封装了对数据库连接和访问
sth(statment handle) sth表示语句或数据对象句柄,封装了执行sql后返回值对象
DBI.connect("dbi:Mysql:schemaName:host","username","passwd")打开数据库连接
if dbh
puts "success"
else
puts "fail"
end
disconnect 关闭数据库连接
dbh.disconnect if dbh
执行sql语句
available_drivers 返回所有可用驱动列表
ping 判断数据库连接是否正常,返回true/false
execute 返回SQL语句,返回一个statement结果集
do 执行sql语句,不返回statement结果集
如 dbh.do("DROP TABLE xxx")
处理结果集方法
prepare 返回一个statment对象实例,但是不执行
fetch 返回下一条记录
each 遍历每一条记录的迭代器
fetch_array 同fetch
fetch_hash 同fetch
fetch_all 把所有元素存放到一个数组中,并且数组中的每一个元素都是数组
fetch_scroll(direction,offset) 从指定位置返回元素
fetch_many(int) 从当前位置获取int条元素
finish 结束执行sql
rows 返回行数
如
sth=dbh.prepare("select something")
sth.execute
puts sth.fetch_many(3)
sth.finish
rescue DBI::DatabaseError => e
puts "error message:"
puts "err no: #{e.err}"
puts "err string : #{e.errstr}"
ensure
dbh.disconnect if dbh
column_*获取查询数据的行数、列数、以及名称
sth.column_names.size 返回语句大小
rows=sth.fetch_all 获取结果集的行数
rows.size 行数
sth.column_names.size 列数
自动提交
dbh['AutoCommit']=true 事务自动提交
dbh.commit dbh.rollback 事务提交和回滚
使用dbh.transaction 会自动决定commit或rollback
require "dbi"
dbh=DBI.connect()
dbh['AutoCommit']=false
dbh.transaction do |dbh|
dbh.do("update sth")
dbh.do("update sth")
end
Ruby mysql类
Mysql类 提供连接服务器方法,发送sql,关闭打开连接
Mysql::Result 处理返回结果
Mysql::Field 处理结果集的元数据,如列名,行数和列数
Mysql::Error 异常处理
连接db
require mysql
dbh=Mysql.real_connect("localhost","root","root","book")
dbh.get_server_info 获取服务器版本号
rescue Mysql::Error=>e
puts "err no: #{e.errno}"
puts "err message: #{e.error}"
puts "err stat: #{e.sqlstate}" if e.respond_to?)"sqlstate")
ensure
dbh.close if dbh
dbh.query("DROP TABLE xxx") 执行sql
fetch_row方法进入下一行
res=dbh.query("select sth")
while row=res.fetch_row do
printf "%s,%s\n",row[0],row[1]
end
使用each迭代器遍历结果
res.each do |row|
puts "#{row[0]} #{row[1]}"
end
fetch_row返回连续行的数组,fetch_hash返回hash对象,each_hash返回hash对象
while row=res.fetch_hash do
puts "#{row['name'] #{row['value']}"
end
判断是否为null
row[0]='NULL' if row[0].nil?
特殊字符处理,escape_string,防止注入攻击
name=dbh.escape_string("xxx'xxx")
res.num_rows 结果集的行数
res.num_fields 结果集列数
dbh.affected_rows 获取受影响的行数