Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828505
  • 博文数量: 188
  • 博客积分: 4433
  • 博客等级: 上校
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-14 07:14
个人简介

linux

文章分类

全部博文(188)

文章存档

2016年(6)

2015年(22)

2014年(18)

2013年(5)

2012年(125)

2011年(10)

2010年(2)

分类: Python/Ruby

2012-03-01 11:17:23

Ruby中的环境常量
$! 最近一次错误信息
$@ 错误产生的位置
$_ gets最近读的字符串
$. 解释其最近读的行数
$& 最近一次与正则表达式匹配的字符串
$~ 作为子表达式组的最近一次匹配
$n 最近匹配的第n个子表达式
$= 是否区别大小写的标志
$/ 输入记录分隔符
$\ 输出记录分隔符
$0 Ruby 脚本文件名
$* 命令行参数
$$ 解释器进程ID
$? 最近一次执行的子进程退出状态

Hash类常用方法
size()    返回Hash对象长度
length()    返回Hash对象的长度
include?(key) 判断执行Hash是否包含key
has_key?(key) 同上
delete(key) 删除key
keys() 返回所有key组成的数组
values() 返回所有value组成的数组

遍历Hash
each 迭代key和value
each_key 迭代输出key
each_pair 迭代输出key-value对
each_value 迭代输出value
这两种循环是一样的
person.each do |key,value|
puts key.to_s+"=>"+value.to_s
end

person.each{|key,value|
puts key.to_s+"=>"+value.to_s
}

puts pring p的区别

puts会识别双引号""内的转义符,每打印一串信息,在结果后面自动换行。puts的话,用+来连接就不会自动换行了。

print也会识别双引号""内的转义符,但每打印一串信息,不会在结果后面自动换行。
p则不会识别双引号""内的转义符,怎样的内容就怎样按原来的字符串输出,且在结果后自动换行。


控制结构
if condition then
   xxx
elsif condition
  xxx
else
  xxx
end
unless condition then
else
end
case xxx
when xxx
  xxx
when xxx
  xxx
end
tips:when使用的是===,意味着后面可跟Range对象
while condition do
  xxx
end
tips:do 可省略
untill condition do
  xxx
end
for else in Array|Hash do
 xxx
end
for key,value in person do
 xxx
end

loop do
  xxx
end
tips:break跳出循环,next终止当前循环,redo终止当前循环,且不判断循环条件

在迭代,块或for...in结构中,retry重启迭代器。从第一个开始循环

return结束循环,同时结束函数运行

多行文本定义
info=%Q{
name=#{name}
}
tips:Q类似“,q类似于‘
或者使用<<
info=<
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 获取受影响的行数









阅读(2426) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

桔色花朵2012-03-02 03:09:24

笔记挺详细的,加油↖(^ω^)↗