Perl 6 程式設計教學:副常式

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