ror学习总结2

ror学习小结2
1 定义模块
   module xxx x
      方法体
    end
  可以在类中混合方法体,比如
  module abc
     def abc1
end

    class Test
      include abc
end
   test=Test.new
    test.abc1

2 命名空间
   module  的名不同,在module中可以包含class ,class中即使有相同的def方法定义也没问题

3 begin end 块
   当多个begin 。。end块时,按加载顺序依次执行begin ,end的顺序则先出现的最后执行,反过来最先
  而at_exit则在END之后再执行,顺序依然是出现的最后执行,反过来最先。
    
4  加载其他文件
    load的用法:load "Module/xxxx/xxx.rb"
   require则可以加载各类其他文件,但只能加载一次,而load 可以加载多次
    extend:在一个对象中引入一个模块
      module Mood
      def test
       end
       end
    class Person
     extend Mood
      end
     person=Person.new
     person.extend(Mood)
     person.test
5 别名
    def name
    end
   alias news_name name
6 定义:判断某个表达式是否已经完成定义,使用defined
   defined?表达式 比如defined?"hello" 输出expression. 还可以判断方法,当然一个方法已定义时,输出
"method"等等。

7 method_missing ,当调用一个类和实例的某个方法时,如果不存在,则调转
      def method_missing XXX
     end

8 duck typing特性

例子:
    class MusicAvi
  def play  
    puts ".avi格式的视频已经添加到列表中"
  end   
  end
class Music3gp
  def play
    puts ".3gp格式的视频可以播放"
  end
end
class MusicRmv
  def play
    puts ".rmv的格式的视频在这里也可以播放,不信,你试试"
  end
end
class MusicRmvb
  def play
    puts ".rmvb格式的视频更不用说 了。"
  end
end
def playMusic(music)
  music.play
end
playMusic MusicAvi.new
playMusic Music3gp.new
playMusic MusicRmv.new
playMusic MusicRmvb.new、


9 proc对象
   pr=Proc.new{puts "hello"}
   pr.call,这个时候才会输出hello
   实际上将其值保存下来了。比如:
     def call_proc(pr)
     pr.call //这里输出hello
     end
      a="hello"
      pr=Proc.new(puts a)
     参数加&,则该参数作为一个Proc对象来处理
  def info(pr)
  pr.call
end
pro=Proc.new{
@name="郭靖"
@age=20
@expression="人虽然笨,但纯真善良是不可改变的事实"
puts "名字是:#{@name}"
puts "年龄是:#{@age}"
puts "描述是:#{@expression}"
}
info(pro)

10  动态执行字符串代码
   str="def xxxx;puts 'sdsdds';end"
   eval(str)
12 异常
    begin end 内放要保护的代码块;而rescue为抛出异常,ensure完成资源回收
    异常出现的信息:#{$!.to_s}
                 异常出现的位置:   #{$@.to_s}
      retry:在遇到异常的情况下,重新跳转到begin部分,比如:
     begin
       ....
      end
      rescue
         retry
      end
 

  13 创建自定义异常类
     class NewException<Exception
      def Erromessage
          ....

           end
      rescue NewsException=>e
             #{e.Erromessage}
14 正则表达式中,使用=~可以判断,如果有匹配的字符串则返回其索引,否则返回nil
15 显示时间:time=Time.new
             #{time.year},#{time.month}........

16 返回一年中的第几日
          time=Time.new
          #{time.yday}天,#{time.mday}//一个月中的第几日  #{time.wday} //一个星期中的第几日
         
17 日期格式化 time.strftime("今天是%x")  ..........

18 创建线程
     xiancheng=Thread.new do
      end
     还可以用start和fork来创建
     Thread.start(fork) "hello" do |value|
     currentThread=Thread.current //返回当前线程
   执行join,可以挂起当前线程
     pass:暂停当前线程,sleep+秒数  休眠线程;
     exit和kill,可以停止线程
    thread=Thread.start do
....
     end
      s1=thread.status //获得当前线程状态
19 Mutex类
     @mutex=Mute.new
    锁定资源 @mutex.lock
20 垃圾回收机制
     GC.enable,GC,start,GC.disable

21 获得文件权限
    fp="xxxx.doc"
    File.stat(fp).mode //获得权限
    File.chmod(01522,fp)//设置权限
    FileTest.exist?(fp)
  
   filePath="d:\\test.php"

puts "File Path: #{filePath}"
if(FileTest.exists?(filePath))
puts "访问权限: #{File.stat(filePath).mode}"
size=FileTest.size(filePath)/1024
puts "文件大小: #{size} KB"
puts "创建时间: #{File.ctime(filePath)}"
puts "最后修改时间: #{File.mtime(filePath)}"
puts "最后访问时间: #{File.atime(filePath)}"
else
puts "文件不存在!"
end
 
22 读取文件
   例子:file=File.new(fp);
          或者file=open(fp);file.close
   file.read(8);file.readchar //读一个字符
  gets方法,一行行读,读到文件尾返回nil
    while line=file.gets
       put line
      end
例子:
   fp="ReadFile.rb"
file=File.new(fp)
lines=file.readlines
file.close
i=0
while i<lines.length do
puts "#{i} : #{lines[i]}"
i+=1
end

23 写入文件
    class SiteInfo
def initialize(title, domainName, ip, email)
@title=title
@domainName=domainName
@ip=ip
@email=email
end
attr_accessor(:title, :domainName, :ip, :email)
end

siteinfo=SiteInfo.new("dsdsdsd","www.sdsdsd.com","127.0.0.1","a@yz0101.com")

filePath="siteInfo.txt"
file=File.new(filePath, "w")
file.puts(siteinfo.title)
file.puts(siteinfo.domainName)
file.puts(siteinfo.ip)
file.puts(siteinfo.email)
file.close
24 删除文件;delete和unlink;
   重命名:File.rename(原来文件名1,新文件名1)
   File.dirname(fp) //获得文件所在目录名
   File.basename(fp) //获得连后缀的名
   File.basename(fp,".txt")//去掉后缀
   File.expand_path(fp) //获得绝对路径
    Dir.delete("目录名") Dir.rmdir("xxxx") //换名
    Dir.pwd 获得当前目录

25 MYSQL相关操作
   1)例子
    require "mysql"

def createSQL(score)
"insert into scores(subject, score, student_name, `explain`) "+
"values('#{score.subject}', #{score.score}, '#{score.student_name}', '#{score.explain}')"
end

def saveScore(dbh, score)
sql=createSQL(score)
dbh.query(sql)
if(dbh.affected_rows==1)
puts "学生 #{score.student_name} 的成绩信息已被加入数据库"
end
end
     # 创建数据库连接对象并打开数据库连接
dbh = Mysql.real_connect("localhost", "root", "", "db_student")
   2)遍历
       res=dbh.query(sql)
       while row=res.fetch_row
          row[0].......
        也可以用HASH:#{res.fetch_hash["字段名"]

     3)显示结果集时,如果为空,可以做点判断,比如:row[2]=0 if row[2].nil?
     40
    4)过滤攻击  insertcontent=dbh.escape_string(".....")
    5) #{res.num_fields}字段数 #{res.num_rows} 结果集中行数
   6)使用DBI操作数据库
      require "dbi"

begin
dbh=DBI.connect("dbi:Mysql:db_log:localhost","root","")
dbh.do("create table log_02(
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `user` varchar(50),
  `operate` varchar(250),
  `record_time` datetime,
  PRIMARY KEY (`id`)
)")

rows_num=dbh.do("
insert into log_02(user,operate,record_time)
values('admin','账号 admin 登录系统','2010-12-25 12:25:30'),
('admin','管理员 admin 删除用户 joker','2010-12-25 12:27:35')
")

puts "操作响应行数为: #{rows_num}"
rescue Mysql::Error => e
puts "Error Number: #{e.errno}"
puts "Error Message: #{e.error}"
puts "Error State: #{e.sqlstate}" if e.respond_to?("sqlstate")
ensure
dbh.disconnect if dbh
end

       DBI支持占位符,比如
       rows_num=dbh.do("
insert into
staffs(`name`, `sex`, `age`, `politics_status`, `IDNO`, `birthdate`, `email`, `mobile`,

`native_place`, `blood_type`, `nation`, `work_unit`, `school`)
values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
"李小贝", "女", 25,
.........

    7)事务处理
require "dbi"
dbh=DBI.connect("dbi:Mysql:db_bank:localhost","root","")
dbh['AutoCommit']=false

money=800 #转账金额
factorage=20 #手续费
output="6543216598743210" #转出账户
input="6543216965413254" #转入账户

begin
#从转出账号上扣除转账金额
dbh.do("update cards set money=money-#{money} where card_number='#{output}'")
#向转入账号上添加转账金额
dbh.do("update cards set money=money+#{money} where card_number='#{input}'")
#从转出账号上扣除手续费
dbh.do("update cards set money=money-#{factorage} where card_number='#{output}'")
dbh.commit
rescue Exception => e
puts e
dbh.rollback
end