Ruby之旅(14) ruby中的模組 和 代碼塊,過程對象

來源:互聯網
上載者:User
Ruby中比較特殊的是module和block.

module有命名空間的作用 可以將類,方法,和常數組織在一起
module還有mixin的方法,可以在class內部include一個module來實現混入一個module裡的執行個體方法

sample:module MSample
    PI = 1
    def self.say
        puts "static hi"
    end
    
    def say
        puts "instance hi"
    end
    
    class Inner
        include MSample #mixin module MSample
    end
    
end

class Sample
    include MSample #mixin module MSample
end


MSample::PI = 5
puts MSample::PI.to_s # put "5"
MSample.say # put "static hi"

puts MSample.class # put "Module"

(Sample.new).say # put "instance hi"

(MSample::Inner.new).say # put "instance hi"

block是一個代碼塊的意思,比如
{
...
}

do
...
end
都是代碼塊,可以在調用函數的時候不僅傳入參數,並傳入代碼塊,使用yield來調用,如:def repeatePutLine(number)
    number.times{|n|
        puts "#{n+1}.#{yield}"
    }
end

repeatePutLine(5){"hallo"}

代碼塊不僅可以匿名,也可以賦給一個handle,比如def repeatePutLine(number)
    number.times{|n|
        puts "#{n+1}.#{yield}"
    }
end

h = Proc.new{
    "hallo"
}

repeatePutLine(5){h.call}

上面的h在ruby中被稱為一個過程對象,可以被視為一個代碼塊的handle,在調用過程對象裡的代碼時,呼叫該過程對象的call方法即可,過程對象相當於其他語言的lambda運算式,但是比lambda運算式更加靈活與強大。

一般情況下過程對象不使用Proc.new來建立,直接用proc來建立即可,如def repeatePutLine(number)
    number.times{|n|
        puts "#{n+1}.#{yield}"
    }
end

h = proc{
    "hallo"
}

repeatePutLine(5){h.call}

其實代碼塊最好的應用的例子就是數組的each,collect,map等方法,都應用了匿名代碼塊。
(1..5).each{|i| puts "#{i}.hallo"}

過程對象的最簡單例子p = proc{|arg| puts arg} 

p.call("hello")

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.