Ruby學習筆記-Method,Class


Method

a)  定義:

  def 方法名 (參數)              #在ruby中方法的參數可以不加括號

         #do something

  end 

  注:方法名命名規則:以小寫字母或者下划線開始,后邊跟數字,字母和下划線,單詞之間用下划隔開:

      def hello_world

             puts “Hello world”

  end

  方法名后邊可以跟=,  ?, !

  “=”: 表示該對象的參數可選,若調用時,沒有參數,則使用默認的

  “?”: 表示該方法是查詢功能的方法

  “!”: 修改接收對象的方法

 

b) 方法參數:

  1.設定方法參數默認值:在定義方法時,可以為一些或全部參數指定默認值。在參數后加下等號和一個值,就可以為該參數指定一個默認值,如:

  def hello(name="ruby")

             puts("Hello, #{name}")

  end

  hello()

  hello("world") 

  另外,參數的默認值不一定必須是常量,也可以是任意表達式,還可以是實例變量的引用,還可以是前面定義參數的引用。

       def hello(a=10,b=5,c=a-b)

             puts a,b,c

  end

  hello()

  puts

  hello(1,2,10)

 

  2.可變長度參數列表:Ruby中接受任意數目的參數,要在某個參數前加上一個*號,在方法的代碼中,這個參數表示成一個數組,它包含傳給這個位置上的0個或多個參數。比如:

        def hello(first,*rest)

              p first

              p rest

   end

   hello("11","22","33","44","55")       

        注:在ruby1.9中,用*打頭的參數要放在帶有默認值參數的后面,其后可以再指定普通參數,但是該普通參數要放在&打頭的參數之前。

 

        3.哈希表作為有名參數:如果一個方法的有多於兩三個參數時,程序員很難記清楚參數的順序,這時我們就可以使用哈希對像作為參數,如:

        def sequence(args)

              m=args[:m]

              c=args[:c]

               n=args[:n]

              a=[]

              3.times{|i| a << m*i + c}

              p a                 #=> [10, 15, 20]

   end

   sequence({:n=>3, :m=>5,:c=>10})        #調用方法,傳遞哈希對像      

       另外,如果哈希對象是最后一個參數(或后面只有一個用&打頭的代碼塊參數),Ruby允許省略哈希字面量的大括號。 

   sequence(:n=>3, :m=>5,:c=>10)       

       因為Ruby中方法調用可以省略圓括號,所以也可以寫成下面這樣的形式: 

   sequence :n=>3, :m=>5,:c=>10      

       如果省略了圓括號,就必須省略大括號,否遇Ruby認為你傳遞了一個代碼塊給這個方法。

 

       4.代碼塊參數:在Ruby中每個方法調用都可以緊跟一個代碼塊,每個關聯代碼塊的方法可以通過yield語句調用代碼塊中的代碼。

  def hello(n,m,c)

      i=0

      while(i<n)

         yield i*m + c

         i+=1

     end

  end

  hello(3,2,1){|x| puts x} 

          代碼塊是匿名的,如果希望明確的來控制一個代碼塊,可以在方法最后加上一個參數,並用&做這個參數的前綴。這個參數會指向傳給方法的代碼塊,該參數是一個Proc對象,它不使用yield語句調用,而是直接通過Proc的call方法來調用:

           def sequence(n,m,c,&b)

              i=0

              while(i<n)

                  b.call(i*m+c)

          i+=1

             end

    end

    sequence(5,2,2){|x|puts x}

  或

         def sequence(n,m,c,b)

              i=0

              while(i<n)

                b.call(i*m+c)

         i+=1

             end

   end

   p=Proc.new{|x|puts x}

     sequence(5,2,2,p)} 

  注:用&打頭的代碼塊參數必須是最后一個,這是為了與省略了括號的數組與哈希參數區別。

 

c) 返回值

  方法代碼的最后一個表達式的值會作為方法調用表達式的值返回。在Ruby中可使用return關鍵字顯式返回表達式的值,當然也可以不使用return關鍵字,隱式返回表達式的值。 

 

Class

a)  定義

   class name

      def initialize (pram1, pram2, …)

              @pram1 = pram1

              @pram2 = pram2

              …

      end

              …

    end

 

  Note: 類名的首字母大寫,后面的單詞的首字母也大寫;

  Initialize 方法如果不做定義,系統默認有一個initialize 方法,在實例化變量時無需給其參數;若用戶自定義initialize方法后,實例化對象時就要按照該方法的格式實例化;

  Ruby中在實例嵌套類時,需要需要使用”外部類::嵌套類.new”的格式實例化潛逃類。

 

b) 繼承

  class  SubCalss < SuperClass

    ...

  end

 

c)訪問器方法和屬性

  通俗版:

  class Test

         def initialize(x,y)

                @x=x

                @y=y

         end      

         def x; @x;end

         def y;@y; end 

         def  x=(value)

                @x=value

         end 

         def  y=(value)

                @y=value

         end

  end

 

   改進版:

  class Test

         attr_reader :x, :y

         #attr_accessor

         #attr_writer

  end

 

d) 類方法

  在ruby中可以使用類名稱直接訪問的方法,稱為類方法。有三種方法可以定義一個類方法;

       1)類名.方法名

       2) self.方法名 #(使用self的目的之一是:DRY, don’t repeat yourself)

       3)class << self

                def 方法名

                     …

                end

                     …

          end

 

e) 類變量:

  在Ruby中,還可以定義類變量,類變量需要以”@@”開頭,它屬於某個類,所以在類的某個實例改變類變量時,將引起實例所屬類的類變量發生改變。即一旦類變量發生改變,所有實例調用的類變量都會發生改變。類變量使用之前一定要初始化;

 

f) 訪問控制

  Public 可以被任何實例化對象調用,沒有限制訪問訪問控制。方法默認是public,initialize除外,默認為private. 另外一個例外是所有在類外定義的”全局”方法,這些方法被定義為Object對象的私有實例方法

  Protected 只能被定義了該方法類或其子類對象調用。整個家族均可訪問。

  Private 不能對象直接調用,接收者只能是self。 也就是說私有方法只能在當前對象的上下文中被調用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM