ruby之程序結構

概括、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、嵌套類

直接在類中定義類,或是在類定義時用::指定的類的所屬類。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章