ruby笔记


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

函数参数

def name(a,b)   

.....

end

参数为a,b (必填)

def name(a,*b)  

end

参数至少为a b可以无 也可以是一个或者多个  数组形式存在

def name(a,b=1)

end

参数至少为a  b不指定则为默认值1,指定的话为指定的值

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=<<deff
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=<<deff
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则不需实例化,也可以直接使用。
http://www.listensnow.com/public/it/test/1828424.html
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 MyException<Exception
end

字符串操作
+ 合并多个字符串
puts "www"+"sohu"+".com"
<<末尾增加字符串
cn="China"
cn<<"is china'
#{}添加字符串
str=china
cn="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开头

/$a/ 以a结尾

/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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值