Perl 6 程式設計教學:副常式 (Subroutine)

PUBLISHED ON NOV 16, 2017 — PROGRAMMING

    副常式 (subroutines),也有人稱為函式 (function),是最小的可重用 (reusable) 區塊,也是物件導向程式的基礎。本文將介紹基本的副常式,對於進階的議題,將於後續文章中介紹。

    使用副常式

    我們先前已經使用過一些副常式了,如下:

    在這裡,我們省略掉括號,實際上可以寫成:

    當語義清楚時,省略括號較為美觀,但可依個人風格選擇。

    由於 Perl 6 是物件導向語言,也可以使用方法呼叫 (method invocation) 的方式:

    建立副常式

    使用 sub 宣告副常式,如下:

    參數

    副常式可以加入參數 (parameters),以改變副常式的行為:

    參數可加入預設值 (default value),使用者可自行決定是否要填入參數:

    除了用固定位置參數外,也可以用命名參數 (named parameters),如下例:

    用命名參數的好處是不用記憶參數位置。

    如果外部名稱和內部名稱相同,可再進一步簡化,如下例:

    修改參數

    一般來說,參數本身是不能修改的,這是為了程式的安全性著想。因此,以下程式會引發錯誤:

    如果想要修改參數,可以加上 copy 的 trait,將參數複製一份,但不會修改參數:

    如果真的要修改參數本身,可加上 rw 的 trait,如下:

    由於 rw trait 可能會造成一些不易發現的錯誤,應謹慎使用。

    回傳值

    副常式可以將運行結果回傳,預設會回傳副常式最後一行敘述:

    如果需要提早回傳值,可使用 return

    也可以藉由串列回傳多個值:

    限定型別

    副常式可以選擇性地加入型別資訊,避免程式傳入錯誤的值:

    以陣列為參數

    副常式也可以用陣列為參數,如下例:

    如果副常式接受兩個以上的變數,可以把陣列攤平 (flatten) 後傳入,如下例:

    如果副常式接收不定長度的變數,可以把變數吃入 (slurp),如下例:

    副常式重載

    使用 multi 可以宣告兩個以上同名但不同參數的副常式,實例如下:

    遞迴

    遞迴是會呼叫自己的副常式,在程式設計中相當常見。階乘是一個例子:

    費伯那西數 (Fibonacci number) 也是一個常見的例子:

    狀態變數

    使用 state 可保存副常式內部變數狀態,之後可再重覆呼叫,如下例:

    comments powered by Disqus