Ruby定義帶塊的方法

Ruby定義帶塊的方法

Ruby中do ~end之間的部分稱為塊,也可以寫為{..}
下面看一個簡單例子,怎么自定義帶塊的方法.

def myloop
    while true
        yield
    end
end
num = 1
myloop do 
    puts "num is #{num}"
    break if num > 100
    num *= 2
end

這里使用了yield,yield是定義帶塊的方法時候重要的關鍵字,可以這么理解yield,調用方法時候通過塊傳遞進來的處理會在yield定義的地方執行。上面這個例子中yield部分沒有參數,如果有參數,程序就會將參數當做塊變量傳遞到塊中
下面這個例子對yield傳遞1個參數,就有1個塊變量接受。通過對yield傳遞0,1,3個參數,對應的塊做如何處理的。

def block_args_test
    yield() #0個塊變量
    yield(1) #1個塊變量
    yield(1, 2, 3) #3個塊變量
end
puts "通過|a|接收塊變量"
block_args_test do |a|
    p |a|
end
puts 

puts "通過|a, b, c|接收塊變量"
block_args_test do |a, b, c|
    p |a, b, c|
end
puts 

puts "通過|*a|接收塊變量"
block_args_test do |*a|
    p |*a|
end

輸出結果:

通過|a|接收塊變量
[nil]
[1]
[1]

通過|a, b, c|接收塊變量
[nil, nil, nil]
[1, nil, nil]
[1, ,2, 3]

通過|*a|接收塊變量
[[]]
[[1]]
[[1, 2, 3]]

再舉一個傳遞塊參數,獲取塊值的例子

def total(from, to)
    result = 0
    from.upto(to) do |num|
        if block_given?
        result += yield(num)
        else 
        resunt += num
        end
    end
    return result
end

p total(1, 10)
p total(1, 10) {|num| num ** 2}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容