概括、ruby程序由一个或多个ruby源文件组成,源文件由模块组成,模块内部有控制结构、类对象、方法、及表达式等元素,下面就按照这个思路来总结ruby的程序组织结构。
一、源文件
1.1、文件包含
复制代码 代码如下:
#file1.rb
inc_path=$0.sub(/\/\w+\.rb/,"") #获取当前路径的目录
$:.insert(-1,inc_path) #将当前路径加入到load路径数组
require "file2.rb"
require "file2.rb" #require包含文件只会被导入一次
load "file3.rb"
load "file3.rb" #每次load都会无条件再次导入文件
#file2.rb
print "file2.rb is included\n"
#file3.rb
print "file3 is included\n"
1.2、源文件执行顺序
复制代码 代码如下:
#coding=utf-8
=begin
这里是
多行注释
=end
END{print "end1\n"}
END{print "end2\n"}
#END块的执行顺序与出现顺序相反
print "text\n"
BEGIN{print "begin1\n"}
BEGIN{print "begin2\n"}
#BEGIN块的执行顺序与出现顺序相同
#BEGIN-TEXT-END
#__END__开头的行后面的内容被忽略
__END__
print "no_text\n"
1.3、源文件书写规则
◆大小写敏感
◆换行符后只能有空白符,并且都会被忽略
◆类和模块及常量名要以大写字母开头,变量以小写字母或者unicode开头
二、模块
复制代码 代码如下:
#module1.rb
inc_path=$0.sub(/\/\w+\.rb/,"") #获取当前路径的目录
$:.insert(-1,inc_path) #将当前路径加入到load路径数组
require "module2.rb"
print Mymod::VAR1,"\n"
Mymod.out
include Mymod #把Mymod导入到当前名字空间
print VAR1
#module2.rb
print "module2.rb is included\n"
module Mymod
var1=99 #模块内的变量
VAR1=100 #模块内的常量
print "Mymode is included,var1 is ",var1,"\n"
def Mymod.out #模块内的方法必须加上模块名
print "Mymod.out run\n"
end
end
三、控制结构
ruby的控制结构和其他语言一样无非就是顺序,分支及循环,但写法上相当的灵活。
3.1、分支结构之if
复制代码 代码如下:
#if.rb
num=100
if (num>200) #可以用unless进行条件取反
print "num>200\n"
elsif num>100
print "num>100\n"
else
print "num<=100\n" #此句执行
end
print "num<=100\n" if num<=100 #if语句可后置,并且if语句本身也是表达式也具有值
if num<=100 then print "num<100\n" #then可用:替换
3.2、分支结构之case
复制代码 代码如下:
num=100
str1=\
case
when num>200 then "num>200"
when num>100 then "num>100"
else "num<=100" #else不使用then
end
print str1,"\n"
case num
when 201 : print "num>200"#:和then起到相同的作用
print 101 when num>100
else print "num<=100"
end
3.3、循环结构
复制代码 代码如下:
num=1
while num<5 #反义词until
print num
num+=1
end
print "\n"
arr1=[1,2,3,4,5]
for i in arr1
print i
end
复制代码 代码如下:
num=1
loop{ #注意{必须和loop在同一行
num+=1
next if num==3 #不输出3
redo if num==4 #把循环体内此行的前面的语句再执行一遍
break if num>5 #大于5则退出循环
print num
}
#输出25
#while,until,for也可用next,redo,break
3.4、控制结构补充
复制代码 代码如下:
print "0 is true!" #0也是true
print "empty string is true!" #""也是true
#在ruby中只有nil被判断是false
四、方法定义
ruby中的方法支持默认参数,可变参数但不支持关键字参数,可以通过传入散列表来模拟实现,方法的最后一句的执行结果就是其返回值。
4.1、一般方法
复制代码 代码如下:
def non_para
print "this is non_para method\n"
end
def many_para(para1,default_para2=2,*dynamic_para3)
print "first para is ",para1,"\n"
print "default_para is ",default_para2,"\n"
for i in dynamic_para3
print i,","
end
end
non_para()
many_para(1,3,5,7,9)
4.2、方法的作用范围
ruby根据方法名来确定方法的作用范围,这样做增加了程序的阅读性。
复制代码 代码如下:
#coding=utf-8
str1="abcdefg"
def str1.len #对象的方法
puts self.length
end
str1.len
class Person
def Person.info #类的方法即静态方法
puts "this is a perosn"
end
end
Person.info
4.3、BLOCK
与方法关联的BLOCK为方法提供了可扩展性。可以把方法中的一部分逻辑抽象成BLOCK独立出来,和子程序调用所不同的是,BLOCK是灵活的,也就是说我可以只完成方法的主干部分,有一些逻辑可以根据需要在调用方法时进行扩展。
复制代码 代码如下:
def func para1
localvalue="local value"
yield(para1)
end
func(100){|para1|print "value of para1 is ",para1,"\n"}
func(100) do |para1|
print "double value of para1 is",para1*2,"\n"
#print local_value 局部变量已不能被继承
end
#yield最后一条语句执行结果就是给方法的返回值。
4.5、方法补充
◆可以undef 方法名取消方法的定义
◆alias 方法名 方法别名 可以为方法定义不同的名字
◆&方法 得到方法的引用,调用时采用 方法引用.call的方式
五、类及对象
5.1、普通的类定义如下
复制代码 代码如下:
class Person
def initialize(name,age)#属性在initialize中定义
@name=name
@age=age
end
def name#属性不能直接被访问,必须通过方法接口进行访问
@name
end
def age
@age
end
end
p1=Person.new("justsong",28)#会用相同的参数调用initialize
print p1.name,"\n",p1.age
5.2、类中方法的访问权限默认为public,ruby有和c++类似的权限声明方式。
复制代码 代码如下:
class Person
def initialize(name,age)#属性在initialize中定义
@name=name
@age=age
end
def name#属性不能直接被访问,必须通过方法接口进行访问
@name
end
private#protected,public
def age
@age
end
end
p1=Person.new("justsong",28)#会用相同的参数调用initialize
print p1.name,"\n"
#print p1.age,private调用将被禁止
5.3、由于属性必须通过方法接口进行访问,所以在书写程序时有些繁琐,可以采用一下的方法进行简写。
复制代码 代码如下:
class Person
attr_reader :name #具有只读权限
attr_writer :age #具有只写权限
attr_accessor :country #具有读写权限
def initialize(name,age,country)
@name=name
@age=age
@country=country
end
end
#其实是ruby自动生成了一些方法
p1=Person.new("justsong",28,"china")#会用相同的参数调用initialize
print p1.name,"\n"
print p1.country,"\n"
#print p1.age,会提示未定义相应方法
5.4、ruby的类也具有类变量(静态变量)及类方法(静态方法)
复制代码 代码如下:
class Person
attr_reader :name
@@country="china" #静态变量
def initialize(name)
@name=name
end
def Person.output #静态方法
print "country is ",@@country,"\n"
end
end
Person.output
p1=Person.new("zhangsan")
p2=Person.new("lisi")
print p1.name,"\n",p2.name
5.5、类的继承
复制代码 代码如下:
class Person
attr_reader :name
def initialize(name)
@name=name
end
end
class Student < Person
attr_reader :grade
def initialize(name,grade)
super(name)#利用super调用父类同名方法
@grade=grade
end
end
s1=Student.new("justsong",10)
print s1.name,"\n",s1.grade
5.6、嵌套类
直接在类中定义类,或是在类定义时用::指定的类的所属类。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]