簡體   English   中英

這里適當關閉是什么意思

[英]What is meant by proper closure here

這是Perl Cookbook直接推出的代碼:

@colors = qw(red blue green yellow orange purple violet);
for my $name (@colors) {
no strict 'refs';
*$name = sub { "<FONT COLOR='$name'>@_</FONT>" };
}

它的目的是形成6個不同顏色名稱的子程序。 在解釋部分,該書內容如下:

這些函數看起來都是獨立的,但實際代碼實際上只編譯了一次。 這種技術節省了編譯時間和內存使用。 要創建正確的閉包,匿名子例程中的任何變量都必須是詞法。 這就是我在循環迭代變量上的原因。

什么是適當的閉合 ,如果省略my會發生什么? 另外,一個typeglob如何使用詞法變量,即使不能為詞法變量定義typeglobs並且應該拋出錯誤?

正如其他人所提到的那樣,食譜使用術語“正確”來指代這樣一個事實,即創建一個子程序,該子程序帶有一個來自更高詞匯范圍的變量,並且該變量不再能通過任何其他方式達到。 我使用過度簡化的助記符“訪問$color變量是'關閉'”來記住這部分閉包。

語句“typeglobs不能為詞匯變量定義”誤解了關於typeglobs的一些關鍵點。 你把它讀作“你不能用'我的'來創建一個類型的地球”是有道理的。 考慮以下:

my *red = sub { 'this is red' };

這將因“我的*紅色”附近的“語法錯誤”而死亡,因為它試圖使用“my”關鍵字定義一個typeglob。

但是,您示例中的代碼並未嘗試執行此操作。 它定義了一個全局的typeglob,除非被覆蓋。 它使用詞法變量的值來定義typeglob的名稱。

順便提一下,typeglob可以是詞匯本地的。 考慮以下:

my $color = 'red';

# create sub with the name "main::$color". Specifically "main:red"
*$color = sub { $color };

# preserve the sub we just created by storing a hard reference to it.
my $global_sub = \&$color;

{
  # create a lexically local sub with the name "main::$color".
  # this overrides "main::red" until this block ends
  local *$color = sub { "local $color" };

  # use our local version via a symbolic reference.
  # perl uses the value of the variable to find a
  # subroutine by name ("red") and executes it
  print &$color(), "\n";

  # use the global version in this scope via hard reference.
  # perl executes the value of the variable which is a CODE
  # reference.
  print &$global_sub(), "\n";

  # at the end of this block "main::red" goes back to being what
  # it was before we overrode it.
}

# use the global version by symbolic reference
print &$color(), "\n";

這是合法的,輸出將是

local red
red
red

在警告下,這將抱怨“Subroutine main :: red redefined”

我認為“正確關閉”只是意味着一個封閉。 如果$ name不是詞法,則所有subs將引用相同的變量(其值將被重置為for循環之前的任何值,如果有的話)。

*$name使用*$name的值作為引用* sigil的有趣類型的引用。 因為$ name是一個字符串,所以它是一個符號引用(因此沒有嚴格的'refs')。

來自perlfaq7

什么是關閉?

閉包記錄在perlref中

閉包是一個計算機科學術語,具有精確但難以解釋的含義。 通常,閉包在Perl中作為匿名子例程實現,並且在其自己的作用域之外具有對詞法變量的持久引用。 這些詞匯神奇地指的是定義子程序時的變量(深度綁定)。

閉包最常用於編程語言中,您可以將函數的返回值本身作為函數,就像在Perl中一樣。 請注意,某些語言提供匿名函數,但無法提供正確的閉包:例如,Python語言。 有關閉包的更多信息,請查看有關函數式編程的任何教科書。 Scheme是一種不僅支持而且鼓勵閉包的語言。

答案繼續以相當詳細的方式回答這個問題。

Perl常見問題解答是一個很好的資源。 但如果沒有人讀過它們,那么維護它們會有點浪費。

編輯 (以便更好地回答帖子中的后續問題):

1 /正確關閉是什么意思? - 往上看

2 /如果遺漏了我會怎么樣? - 它不會起作用。 嘗試一下,看看會發生什么。

3 /一個typeglob如何使用詞法變量? - 變量$name僅用於定義要使用的typeglob的名稱。 它實際上並沒有被用作typeglob。

這有幫助嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM