Perl6 函數重載

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 類型的,上面代碼中的 aliasname 在調用 sayHello 的時候傳入字符串會首先匹配 alias,當 Perl6 找不到合適的簽名的時候纔會去匹配 name, 因爲 nameAny 類型的,所以它可以兼容所有類型,你可以認爲它是動態類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章