亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么Perl 5的函數原型不好?

為什么Perl 5的函數原型不好?

為什么Perl 5的函數原型不好?在……里面另一個堆棧溢出問題 利昂·蒂默曼斯斷言:我建議你不要使用原型。他們有他們的用途,但在大多數情況下,肯定不是在這一個。為什么這可能是真的(或其他)?我幾乎總是為我的Perl函數提供原型,而且我以前從未見過其他人說過關于使用它們的壞話。
查看完整描述

5 回答

?
慕虎8459273

TA貢獻4條經驗 獲得超0個贊

這個函數原型是什么什么用的?

查看完整回答
反對 回復 2019-06-20
?
慕虎8459273

TA貢獻4條經驗 獲得超0個贊

這個函數原型是什么做什么用的?

查看完整回答
反對 回復 2019-06-20
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

如果正確使用,原型并不壞。困難在于Perl的原型不像人們通常期望的那樣工作。在其他編程語言中有背景的人傾向于期望原型提供一種機制來檢查函數調用是否正確:也就是說,他們有正確的參數數量和類型。Perl的原型并不適合這個任務。是因為誤用那太糟了。Perl的原型有一個獨特和非常不同的目的:

原型允許您定義像內置函數一樣的函數。

  • 括號是可選的。
  • 上下文是強加在論點上的。

例如,可以定義如下函數:

sub mypush(\@@) { ... }

并稱之為

mypush @array, 1, 2, 3;

不需要編寫\若要對數組進行引用,請執行以下操作。

簡而言之,原型允許您創建自己的語法糖。例如,Moose框架使用它們來模擬更典型的OO語法。

這是非常有用的,但原型非常有限:

  • 它們必須在編譯時可見。
  • 他們可以被繞過。
  • 將上下文傳播到參數可能會導致意外行為。
  • 除了嚴格規定的形式之外,它們還會使調用函數變得困難。

看見原型所有血淋淋的細節。


查看完整回答
反對 回復 2019-06-20
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

問題是Perl的函數原型并不像人們想象的那樣。它們的目的是允許您編寫像Perl內置函數那樣解析的函數。

首先,方法調用完全忽略原型。如果您正在進行OO編程,那么您的方法有什么原型并不重要。(所以他們不應該有任何原型。)

第二,原型沒有嚴格執行。如果您使用&function(...),原型被忽略了。所以他們不能提供任何類型的安全。

第三,他們是恐怖的遠程行動。(特別是$Prototype,它導致在標量上下文中計算相應的參數,而不是默認的列表上下文。)

特別是,它們使得很難從數組中傳遞參數。例如:

my @array = qw(a b c);foo(@array);foo(@array[0..1]);foo($array[0], $array[1], $array[2]);sub foo ($;$$) 
{ print "@_\n" }foo(@array);foo(@array[0..1]);foo($array[0], $array[1], $array[2]);

指紋:

a b c
a b
a b c3b
a b c

還有3條警告main::foo() called too early to check prototype(如果啟用了警告)。問題是,在標量上下文中計算的數組(或數組片)返回數組的長度。

如果您需要編寫一個功能類似于內置的函數,請使用原型。否則,不要使用原型。

注意:Perl 6將進行完全修改,并且非常有用的原型。這個答案只適用于Perl 5。


查看完整回答
反對 回復 2019-06-20
?
揚帆大魚

TA貢獻1799條經驗 獲得超9個贊

我同意以上兩張海報。一般來說,使用$應該避免。只有在使用塊參數(&),球體(*),或參考原型(\@\$\%\*)


查看完整回答
反對 回復 2019-06-20
  • 5 回答
  • 0 關注
  • 732 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號