https://youtu.be/g8xXrhjqOZM
Damian Conway 在這場於 2017 年 The Perl Conference Amsterdam 的演講中,
於 19:04 處,他開始描述這個重複出現的 code pattern (Raku 語。當時仍名為 Perl 6):
@tape[$head] = .<write> if defined .<write>;
$state = .<state> if defined .<state>;
也就是在意圖要描述「在某個值為不為 undef 時,才將某個值存到某變數中」。
這個代表「某個值」的算式必須在同一行陳述裡面出現兩次。是個重複出現的東西。
然後他以定義新算符 ?= 的手法,將其重構為:
sub infix:< ?= > ($lval is rw, $rval) { $lval = $rval if defined $rval; }
@tape[$head] ?= .<write>;
$state ?= .<state>;
關於這個 "?=" 算符,雖然在符號的使用上有點像是 js / kotlin 中的
safe-navigation "?.",只是其測試對象是在其右方,閱讀方向正好相反。有點像
是主詞位置變到句尾去的感覺。
如果有個反方向的賦值算符,能把其左方的值存在其右方,比方說以下這個 infix assign-to:
sub infix:< assign-to > ($lval, $rval is rw ){ $rval = $lval }
42 assign-to $a;
say $a; #=> 42
那麼基於類似概念而定義出來的 infix ?assign-to 算符,在閱讀方向上就與 safe-navigation 相同了
sub infix:< ?assign-to > ($lval, $rval is rw ){ $rval = $lval if defined $lval }
$a ?assign-to $b;
如果要去把「$a ?assign-to $b」這一句給唸出來的話,就類似:
$a, 如果不是 undef 的話,就存到 $b 裡面
至少,對於已經讀慣 safe-navigation 的人而言,應該是個比較親切的 code pattern。
--