* vs $_ vs $

cale2 問了一個(gè)很難的問題

今天卡爾2拒絕問簡(jiǎn)單的問題。我們來看它今天問了什么難題:

<cale2> 我需要一份關(guān)于 * vs _ vs 的指南。

這個(gè)問題問得多么好。那三種東西都是語法糖, 因?yàn)樯舷挛霓D(zhuǎn)換, 它們能很好地避免折行和更少的 bugs。

我們從我們的老朋友主題變量 $_ 開始。在 Perl 5 中它剛好出現(xiàn)在每個(gè) sub 的外面。在 Perl 6 中它出現(xiàn)在塊的默認(rèn)值之外。

my &block =  { 'oi?' };
&block.signature.say;
# OUTPUT?(;; $_? is raw)?

塊的默認(rèn)簽名是一個(gè)名為 $_ 的位置參數(shù)。因此每個(gè)塊都有一個(gè)主題變量 $_。還有其他設(shè)置 $_ 主題變量的語句,而不引入一個(gè)新的塊,像 withgivengiven 的確引入了一個(gè)塊,但它是特殊的,我在這里不說明細(xì)節(jié))。

say $_ with 42;
# OUTPUT ?42? 

因?yàn)樗悄J(rèn)的, Perl 6 會(huì)在很多地方期待它的出現(xiàn)。最突出的是當(dāng)沒有對(duì)象方法調(diào)用時(shí)。

$_ = 42; say 'oi?' when 42;
.say;
# OUTPUT?oi? 42? 

一個(gè)單獨(dú)的 $ 實(shí)際上是兩個(gè)(有一點(diǎn))的東西。在簽名中,它是一個(gè)我們永遠(yuǎn)不能使用的位置參數(shù)標(biāo)記(也許是因?yàn)槲覀儾辉诤酰?,因?yàn)樗鼪]有名字,因此在它所應(yīng)用的例程中不引入符號(hào)。它對(duì)于 protos 和免費(fèi)的浮點(diǎn)簽名很有用。它的第二個(gè)用途實(shí)際上引入了一個(gè)容器,也沒有符號(hào)。它也是一個(gè)狀態(tài)變量,它的初始化器(如果有一個(gè))不被處理為狀態(tài),并將被調(diào)用多于一次。我們可以使用匿名狀態(tài)變量來計(jì)數(shù)東西。

my @a = <a b c d>;
for @a { say @a[$++] };

# OUTPUT?a
b
c
d ?  

我們可以濫用匿名變量 $ 在列表賦值中跳過我們不想要的值。當(dāng)我們從一個(gè)子例程中得到一個(gè)短的列表時(shí)會(huì)很簡(jiǎn)潔。

my ($,$,$c) = <a b c d>;
say $c;
# OUTPUT?c? 

我很享受這樣的事實(shí),我懶得給一次性變量起名字。認(rèn)知負(fù)荷越小越好。

Whatever * 是問題的難點(diǎn)。有時(shí)它是一個(gè)語法糖標(biāo)記,我們用它來告訴 Perl 6 我們不關(guān)心什么將被選中。在其他時(shí)候,它意味著 Inf, 意思是它們中的所有。

my @a = <a b c d>;
put @a.pick(*);

# OUTPUT?c d b a? 

如果在參數(shù)列表中使用一個(gè)單獨(dú)的 *,它將變成單例 Whatever。由于我們可以要求簽名中的值,我們可以為 muitis 提供接口。

multi sub foo(Int $i){ $i * 42 };
multi sub foo(Whatever){ <42 oi? ?>.pick };
say foo(*);
# OUTPUT??? (your results may vary) 

如果我們?cè)诎\(yùn)算符或調(diào)用的語句中使用 *,它會(huì)形成一個(gè)沒有作用域的塊,并像一個(gè)占位符變量一樣運(yùn)行,而不會(huì)丟失該塊由 * 生成的信息。生成的 Callable 的類型是 Wh??ateverCode 并且當(dāng)提供了 Sub 或方法時(shí), 例程可以在它上面采取不同的行動(dòng)。與真正的占位符變量相反, Whatever 可以用在 where 子句中。

sub foo($a where * < 10){}

對(duì)于他的問題, 這不是一個(gè)完整的答案。這就是為什么我建議卡爾2去閱讀文檔。

感覺還沒有完全說清楚這三個(gè)語法糖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一章 概要 Comming soon! 第二章 基礎(chǔ) 假設(shè)有一場(chǎng)乒乓球比賽,比賽結(jié)果以這種格式記錄:Player...
    焉知非魚閱讀 393評(píng)論 0 0
  • 標(biāo)題: Rakudo and NQP Internals子標(biāo)題: The guts tormented imple...
    焉知非魚閱讀 1,522評(píng)論 1 3
  • 2016-10-20 號(hào)更新。 源文件可以在 github 或 perl6.org上找到. General Rak...
    焉知非魚閱讀 1,059評(píng)論 0 0
  • Perl 6 是 Perl 編程語言家族中的一員. 它仍舊在開發(fā)中, 幾個(gè)解釋器和編譯器在同時(shí)進(jìn)行. 它引入了很多...
    焉知非魚閱讀 1,081評(píng)論 0 2
  • 捕獲 簽名不僅僅是語法,它們是含有一列參數(shù)對(duì)象的 first-class 對(duì)象 。同樣地,有一種含有參數(shù)集的數(shù)據(jù)...
    焉知非魚閱讀 696評(píng)論 0 0

友情鏈接更多精彩內(nèi)容