Perl6 函數重載
重載的概念常常見於那些 OOP
的靜態類型的語言,但是在函數一等公民的 Perl6
中也是能實現函數重載的,要不先來看一下 TypeScript
的函數重載
function sayHello(name:string):void;
function sayHello(name:string, age:number):void;
function sayHello(name:string, age?:number):void {
const suffix = `And i'm ${age} years old`;
const main = `Hello my name is ${name}`
console.info(age ? `${main}, ${suffix}` : main)
}
sayHello('Cat')
sayHello('Cat', 19)
TS
的函數重載是假的函數重載,它只是重載了函數的簽名,這是因爲 TS 的管轄範圍只能是編譯期,而運行時是 js,js 是動態類型的語言,所以只能做到函數簽名的重載
而 Perl
也是一個典型的。動態弱類型
的語言,但是 Perl6
卻聲稱它是一門漸進式的語言,它可以同時支持 靜態
和 動態語言的特性
,判斷的方式很簡單在於是否寫上類型,於是,在 Perl6
中來支持函數重載也是一件很容易的事情,並且有很多種的玩法
multi sub sayHello($name, $age){
say "Hello my name is $name, And i'm $age years old";
}
multi sub sayHello($name){
say "Hello my name is $name";
}
multi sub sayHello(Str $alias){
say "Hello you can call me $alias";
}
multi sub sayHello(Int $age){
say "Hello i'm $age years old";
}
sayHello("Jon");
sayHello("aaa");
sayHello(19);
sayHello("Jon", 19)
用 multi
修飾的 subroutine
表示可以被重載,重載是以函數簽名來區分的,這裏需要注意的是 sayHello($name)
和 sayHello(Str $name)
是兩個不同的簽名,前面的參數沒有寫類型,那麼它的參數是 Any
類型的,上面代碼中的 alias
和 name
在調用 sayHello 的時候傳入字符串會首先匹配 alias
,當 Perl6 找不到合適的簽名的時候纔會去匹配 name
, 因爲 name
是 Any
類型的,所以它可以兼容所有類型,你可以認爲它是動態類型。