Ruby中的环境常量$! 最近一次错误信息$@ 错误产生的位置$_ gets最近读的字符串$. 解释其最近读的行数$& 最近一次与正则表达式匹配的字符串$~ 作为子表达式组的最近一次匹配$n 最近匹配的第n个子表达式$= 是否区别大小写的标志$/ 输入记录分隔符$\ 输出记录分隔符$0 Ruby 脚本文件名$* 命令行参数$$ 解释器进程ID$? 最近一次执行的子进程退出状态Hash类常用方法size()    返回Hash对象长度length()    返回Hash对象的长度include?(key) 判断执行Hash是否包含keyhas_key?(key) 同上delete(key) 删除keykeys() 返回所有key组成的数组values() 返回所有value组成的数组遍历Hasheach 迭代key和valueeach_key 迭代输出keyeach_pair 迭代输出key-value对each_value 迭代输出value这两种循环是一样的person.each do |key,value|puts key.to_s+"=>"+value.to_sendperson.each{|key,value|puts key.to_s+"=>"+value.to_s}puts pring p的区别puts会识别双引号""内的转义符,每打印一串信息,在结果后面自动换行。puts的话,用+来连接就不会自动换行了。print也会识别双引号""内的转义符,但每打印一串信息,不会在结果后面自动换行。p则不会识别双引号""内的转义符,怎样的内容就怎样按原来的字符串输出,且在结果后自动换行。控制结构if condition then   xxxelsif condition  xxxelse  xxxendunless condition thenelseendcase xxxwhen xxx  xxxwhen xxx  xxxendtips:when使用的是===,意味着后面可跟Range对象while condition do  xxxendtips:do 可省略untill condition do  xxxendfor else in Array|Hash do xxxendfor key,value in person do xxxendloop do  xxxendtips:break跳出循环,next终止当前循环,redo终止当前循环,且不判断循环条件在迭代,块或for...in结构中,retry重启迭代器。从第一个开始循环return结束循环,同时结束函数运行多行文本定义info=%Q{name=#{name}}tips:Q类似“,q类似于‘或者使用info=name=deff数组操作unshift 想数组头部添加元素push 向数组尾部添加元素array.unshift("abc")arrayshift 向数组头部删除pop 从数组尾部删除array[n,m] 截取数组从n开始,长度为m的元素列array[n..m]截取从n开始,m为止的元素列array[n...m] 截取从n开始到m为止,但不包括m的元素列方法参数默认值,直接后面加=变量即可,多个参数用(,)def Name (name="Jack",aget=20)xxxendRuby变量局部变量 var 仅在定义类、方法和模块内有效全局变量 $var 全局变量会引起各模块间高耦合,应避免使用实例变量和类变量区别 实例变量是每个具体的对象自有的数据,而类变量是该类的所有对象(实例)所共享的。实例变量若引用尚未被初始化的实例变量的话,其值为nil。【类变量】被一个类的所有实例对象共享,也可以被类方法访问到。类变量名以‘@@’,开始,类变量是私有的,在类外无法直接访问,你只能通过实例方法和类方法去访问它。构造函数class abc  def initialize name,age    @name=name    @age=age  endend对象内置读写属性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}或doxxxendyield用法def go()yield @name,@*** #yield可在调用时被代码块替换endp.go{|name,***| puts "#{name}" puts "#{***}"}tips:如传入参数少于代码块定义的参数个数,则未传递自动转换为nil,若多于,则最后一个转为数组迭代器each——连续访问集合的所有元素 collect—-从集合中获得各个元素传递给block,block返回的结果生成新的集合。 map——-同collect。 inject——遍历集合中的各个元素,将各个元素累积成返回一个值。 类的继承 class Subclass 注意info=abcdeffRuby不支持重载(方法名相同,参数不同)super关键字调用基类的构造函数基类中def initialize name,***  @name=name  @***=***end派生类中def initialize name,***  super speed,nameend调用模块中的类module abc  class xyz  endendtest=abc::xyz.newinclude 加载模块extend用来在一个对象中引入一个模块tips:include和extend区别    include使得module的方法被类实例使用;    extend使得module的方法被类本身使用。意思是include进来的一定要实例化才能使用模块内的function,而extend则不需实例化,也可以直接使用。http://www.listensnow.com/public/it/test/1828424.htmlload 加载扩展名为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"enddef self.method_missing sym  puts "#{sym.to_s} doesn't exit"endmethod_missing是实例的method_missing, self.method_missing是类的方法proc对象,类似于匿名函数,使用.call方法执行块并返回结果在参数前加&,这个形参就被当做Proc对象处理def foo &p  a=penda=foo{puts "something"} #function #foo返回一个Proc对象a.call #调用Proc对象的call方法eval让解释器解释执行某段代码,而不是当做字符串method="def run; puts 'something';end"eval(method)runRuby常见异常RuntimeError  raise方法抛出的默认异常NoMethodError 对象找不到对应方法NameError     解释器碰到一个不能解析为变量或方法名的标示符IOError       当Ruby读关闭的流,写只读的流,等Errono::error 与文件IO相关的一组错误TypeError     方法介绍到不能处理的参数ArgumentError 传递参数的数目出错rescueputs "#{$!.to_s} #{[email protected]_s}"raise 抛出异常raise ArgumentError,"some exception"异常类,必须从Exception继承class MyExceptionend字符串操作+ 合并多个字符串puts "www"+"sohu"+".com"cn="China"cn#{}添加字符串str=chinacn="www.#{str}.com"str.replace替换变量str.replace("www.sohu.com")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"endif "Hello World".match(/Hello*/)  puts "matched"end  也可以使用=~,和Perl里面差不多$1,$2,$3可以捕获子匹配时间类 Timeyear,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%yt.Time.nowputs t.strftime("%c")创建线程thread=Thread.new do  xxxendthread.start/fork 创建线程和new相同thread.current 返回当前线程thread.join 挂起当前线程thread.pass 暂停线程,thread.exit/kill 停止线程sleep 5 暂停线程几秒线程状态sleep sleep状态或等待IOrun    正在运行aborting  被取消false 正常终止nil   非正常终止thread.list 返回存货状态线程thread.main 返回一个引用thread.current 返回当前线程线程同步与锁机制Mutex库,synchronize方法sizedqueue类与queue类文件操作Filestat类filepath="/tmp/aa"data=File.stat(filepath)data.uid uiddata.gic gidFile.chown(uid,gid,filepath) 修改uidgidFile.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) 判断文件是否为0FileTest.size?(fpath) 获取文件大小打开文件File.new(fpath) 只读打开文件,File.open类似File.new(fpath,"r") 同上r  只读模式r+ 读写模式,文件指针在开始处w  只写模式,打开文件会清空,然后写入。若不存在,则创建文件w+ 读写模式,其他同上,注意与r+的区别a  追加模式,文件指针在结尾,若不存在,则创建a+ 读/追加模式,文件指针在末尾,文件若不存在则创建b  二进制方式打开,适合于DOS和Windosf.close 关闭文件f.close_read 关闭只读模式打开的文件,其他情况会出错f.close_write 关闭只写模式打开的文件,其他情况会出错读取文件,有点类似于cread(length,buf)文件指针方法pos 获取文件指针位置pos= 设置文件指针位置rewind 将文件指针移动到文件开始位置lineno 返回当前指针所在行lineno= 将指针移到指定行file.pos=20 移到20行file.readchar 读取一个字符file.readline 读取行,读到末尾会EOFErrorfile.readlines 一次读取所有行,并保存在数组里f=File.new filepathf.readlines.each do |value|  puts valueendFile.gets 与readline类似,当读到末尾是nil,而不会报错while value=file.gets  puts valueend迭代器 each_line 和eachfile.each_line do |value|  puts valueendf.each do |value|  puts valueendeach_byte 按字节迭代还可用IO类的foreach方法,优点是不需要打开文件IO.foreach filepath do |line|  puts lineend写入文件print 一行或多行写入文件,且不换行,可通过设置 $\ 来增加换行puts 一行或多行写入文件,自动换行putc 写入一个字符write 一行字符串写入文件删除文件deleteunlinkrename重命名文件dirname获取目录名basename获取文件名tips,basename后提供了第二个参数,制定了文件扩展名,则获取到的文件名不具有扩展名expand_path获取绝对路径join根据提供字符生成新路径File.join("Ruby","learning","test.txt")pwd,getwd 获取当前目录chdir改变当前目录遍历目录Dir.foreach Dir.pwd do |entry|  puts entryenddir.each do |value|  puts valueendDir.entries方法,返回文件名数组list=Dir.entries Dir.getwdlist.each do|value|  puts valueenddelete,rmdir,unlink 删除指定目录,成功返回0,否则生成Errno::ENOENT或Errno::ENOTEMPTYconnect连接数据库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"enddisconnect 关闭数据库连接dbh.disconnect if dbh执行sql语句available_drivers 返回所有可用驱动列表ping              判断数据库连接是否正常,返回true/falseexecute           返回SQL语句,返回一个statement结果集do                执行sql语句,不返回statement结果集如 dbh.do("DROP TABLE xxx")处理结果集方法prepare 返回一个statment对象实例,但是不执行fetch   返回下一条记录each    遍历每一条记录的迭代器fetch_array   同fetchfetch_hash    同fetchfetch_all     把所有元素存放到一个数组中,并且数组中的每一个元素都是数组fetch_scroll(direction,offset)  从指定位置返回元素fetch_many(int)  从当前位置获取int条元素finish  结束执行sqlrows    返回行数如sth=dbh.prepare("select something")sth.executeputs sth.fetch_many(3)sth.finishrescue DBI::DatabaseError => e  puts "error message:"  puts "err no: #{e.err}"  puts "err string : #{e.errstr}"ensure  dbh.disconnect if dbhcolumn_*获取查询数据的行数、列数、以及名称sth.column_names.size 返回语句大小rows=sth.fetch_all 获取结果集的行数rows.size 行数sth.column_names.size 列数自动提交dbh['AutoCommit']=true 事务自动提交dbh.commit dbh.rollback 事务提交和回滚使用dbh.transaction 会自动决定commit或rollbackrequire "dbi"dbh=DBI.connect()dbh['AutoCommit']=falsedbh.transaction do |dbh|  dbh.do("update sth")  dbh.do("update sth")endRuby mysql类Mysql类 提供连接服务器方法,发送sql,关闭打开连接Mysql::Result 处理返回结果Mysql::Field 处理结果集的元数据,如列名,行数和列数Mysql::Error 异常处理连接dbrequire mysqldbh=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")ensuredbh.close if dbhdbh.query("DROP TABLE xxx") 执行sqlfetch_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]}"endfetch_row返回连续行的数组,fetch_hash返回hash对象,each_hash返回hash对象while row=res.fetch_hash do  puts "#{row['name'] #{row['value']}"end判断是否为nullrow[0]='NULL' if row[0].nil?特殊字符处理,escape_string,防止注入攻击name=dbh.escape_string("xxx'xxx")res.num_rows 结果集的行数res.num_fields 结果集列数dbh.affected_rows 获取受影响的行数
12-25 21:02