概括、ruby程序由一個或多個ruby源文件組成,源文件由模塊組成,模塊內(nèi)部有控制結(jié)構(gòu)、類對象、方法、及表達式等元素,下面就按照這個思路來總結(jié)ruby的程序組織結(jié)構(gòu)。
一、源文件
1.1、文件包含
復制代碼 代碼如下:
#file1.rb
inc_path=$0.sub(/\/\w+\.rb/,"") #獲取當前路徑的目錄
$:.insert(-1,inc_path) #將當前路徑加入到load路徑數(shù)組
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、源文件執(zhí)行順序
復制代碼 代碼如下:
#coding=utf-8
=begin
這里是
多行注釋
=end
END{print "end1\n"}
END{print "end2\n"}
#END塊的執(zhí)行順序與出現(xiàn)順序相反
print "text\n"
BEGIN{print "begin1\n"}
BEGIN{print "begin2\n"}
#BEGIN塊的執(zhí)行順序與出現(xiàn)順序相同
#BEGIN-TEXT-END
#__END__開頭的行后面的內(nèi)容被忽略
__END__
print "no_text\n"
1.3、源文件書寫規(guī)則
◆大小寫敏感
◆換行符后只能有空白符,并且都會被忽略
◆類和模塊及常量名要以大寫字母開頭,變量以小寫字母或者unicode開頭
二、模塊
復制代碼 代碼如下:
#module1.rb
inc_path=$0.sub(/\/\w+\.rb/,"") #獲取當前路徑的目錄
$:.insert(-1,inc_path) #將當前路徑加入到load路徑數(shù)組
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 #模塊內(nèi)的變量
VAR1=100 #模塊內(nèi)的常量
print "Mymode is included,var1 is ",var1,"\n"
def Mymod.out #模塊內(nèi)的方法必須加上模塊名
print "Mymod.out run\n"
end
end
三、控制結(jié)構(gòu)
ruby的控制結(jié)構(gòu)和其他語言一樣無非就是順序,分支及循環(huán),但寫法上相當?shù)撵`活。
3.1、分支結(jié)構(gòu)之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" #此句執(zhí)行
end
print "num=100\n" if num=100 #if語句可后置,并且if語句本身也是表達式也具有值
if num=100 then print "num100\n" #then可用:替換
3.2、分支結(jié)構(gòu)之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、循環(huán)結(jié)構(gòu)
復制代碼 代碼如下:
num=1
while num5 #反義詞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 #把循環(huán)體內(nèi)此行的前面的語句再執(zhí)行一遍
break if num>5 #大于5則退出循環(huán)
print num
}
#輸出25
#while,until,for也可用next,redo,break
3.4、控制結(jié)構(gòu)補充
復制代碼 代碼如下:
print "0 is true!" #0也是true
print "empty string is true!" #""也是true
#在ruby中只有nil被判斷是false
四、方法定義
ruby中的方法支持默認參數(shù),可變參數(shù)但不支持關鍵字參數(shù),可以通過傳入散列表來模擬實現(xiàn),方法的最后一句的執(zhí)行結(jié)果就是其返回值。
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根據(jù)方法名來確定方法的作用范圍,這樣做增加了程序的閱讀性。
復制代碼 代碼如下:
#coding=utf-8
str1="abcdefg"
def str1.len #對象的方法
puts self.length
end
str1.len
class Person
def Person.info #類的方法即靜態(tài)方法
puts "this is a perosn"
end
end
Person.info
4.3、BLOCK
與方法關聯(lián)的BLOCK為方法提供了可擴展性??梢园逊椒ㄖ械囊徊糠诌壿嫵橄蟪葿LOCK獨立出來,和子程序調(diào)用所不同的是,BLOCK是靈活的,也就是說我可以只完成方法的主干部分,有一些邏輯可以根據(jù)需要在調(diào)用方法時進行擴展。
復制代碼 代碼如下:
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最后一條語句執(zhí)行結(jié)果就是給方法的返回值。
4.5、方法補充
◆可以undef 方法名取消方法的定義
◆alias 方法名 方法別名 可以為方法定義不同的名字
◆方法 得到方法的引用,調(diào)用時采用 方法引用.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)#會用相同的參數(shù)調(diào)用initialize
print p1.name,"\n",p1.age
5.2、類中方法的訪問權(quán)限默認為public,ruby有和c++類似的權(quán)限聲明方式。
復制代碼 代碼如下:
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)#會用相同的參數(shù)調(diào)用initialize
print p1.name,"\n"
#print p1.age,private調(diào)用將被禁止
5.3、由于屬性必須通過方法接口進行訪問,所以在書寫程序時有些繁瑣,可以采用一下的方法進行簡寫。
復制代碼 代碼如下:
class Person
attr_reader :name #具有只讀權(quán)限
attr_writer :age #具有只寫權(quán)限
attr_accessor :country #具有讀寫權(quán)限
def initialize(name,age,country)
@name=name
@age=age
@country=country
end
end
#其實是ruby自動生成了一些方法
p1=Person.new("justsong",28,"china")#會用相同的參數(shù)調(diào)用initialize
print p1.name,"\n"
print p1.country,"\n"
#print p1.age,會提示未定義相應方法
5.4、ruby的類也具有類變量(靜態(tài)變量)及類方法(靜態(tài)方法)
復制代碼 代碼如下:
class Person
attr_reader :name
@@country="china" #靜態(tài)變量
def initialize(name)
@name=name
end
def Person.output #靜態(tài)方法
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調(diào)用父類同名方法
@grade=grade
end
end
s1=Student.new("justsong",10)
print s1.name,"\n",s1.grade
5.6、嵌套類
直接在類中定義類,或是在類定義時用::指定的類的所屬類。