Ruby學習筆記-Method,Class

來源:互聯網
上載者:User

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。 也就是說私人方法只能在當前對象的上下文中被調用。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.