Raku 標志表示基礎變數的性質(例如,$scalar、@positional、%associative、&code)。
可以使用反斜杠(例如,\some-variable)將變數宣告為無符號,然后在以后不使用符號(即,some-variable)參考它。
只是想知道在什么情況下更喜歡使用無印記變數?
uj5u.com熱心網友回復:
形式的宣告為運算式my \a = expr引入了一個別名,而不對其強制執行任何型別的背景關系,就像對一個帶符號的變數賦值一樣。因此,它們的主要用途是當您不想擁有與任何印記相關聯的任何語意時。aexpr
就個人而言,當我構建惰性處理管道并想要命名部件時,我最常使用它們。舉個簡單的例子:
my $fh = open 'somefile';
my \no-comments = $fh.lines.grep({ not /^\s*'#'/ });
for no-comments -> $sig-line {
...
}
Agrep回傳一個Seq,如果迭代,將執行該操作。如果我改為使用@-sigil 變數:
my $fh = open 'somefile';
my @no-comments = $fh.lines.grep({ not /^\s*'#'/ });
for @no-comments -> $sig-line {
...
}
那么雖然結果是一樣的,但記憶體性能會大不相同:除非遇到明確標記為惰性的東西,否則賦值是急切的,因此這會將所有非注釋行存盤到@no-comments其中,然后對其進行迭代。因此,所有這些行都保留在記憶體中,而在無符號版本中,然后處理過的行——只要它們沒有存盤在其他地方——就可以被垃圾收集。
我可以使用一個$印記,但這意味著一個單一的專案,這意味著如果我這樣做:
my $fh = open 'somefile';
my $no-comments = $fh.lines.grep({ not /^\s*'#'/ });
for $no-comments -> $sig-line {
...
}
它不會作業(它會執行回圈的一次迭代,將Seqinto系結$sig-line);我必須以某種方式克服它的專案性質:
my $fh = open 'somefile';
my $no-comments = $fh.lines.grep({ not /^\s*'#'/ });
for $no-comments<> -> $sig-line {
...
}
一個相關的用途是在撰寫不想強制執行任何背景關系的通用代碼時:
sub log-and-call(&foo, \value) {
note(value.raku);
foo(value)
}
同樣,如果我們使用$我們可以添加一個專案包裝器并可能影響foo.
我見過的其他用途:
- 由于您不能重新系結這樣的宣告,因此可以使用它向讀者傳達不變性。也就是說,這不是深度不變性,只是該符號參考的不變性。
- 有些人真的不喜歡印記,所以用這個來避免它們。當然不是使用 Raku 的最自然方式,而是各有各的方式。:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536630.html
標籤:变量乐印记
