常用的成語
如果你必須寫一個類型的名字作爲一個變量聲明的一部分,你還不如把它寫成變量的類型約束和使用.= new
而不是使用任何馬蒂或解決方案:
my NCurses::MEVENT $event .= new
馬蒂的解決方案:
my $event = NCurses::MEVENT.new
作品,因爲$event
現在包含哪些getevent($event)
調用需要它包含,即新的NCurses :: MEVENT對象。但它傳遞了一個簡單的機會來添加類型檢查。
您的解決方案:
my NCurses::MEVENT $event = NCurses::MEVENT.new
指一樣平常成語對於這種情況,但不是DRY。
出了什麼問題
的line of code that glues the Perl 6 getmouse
call to the underlying native NCurses library開始:
sub getmouse(MEVENT) ...
這告訴Perl 6的是getmouse需求NCurses::MEVENT
類型的一個參數。
馬蒂的解決方案工作。他們沒有告訴Perl 6應該包含什麼類型的值$event
。但是他們仍然在其中投入正確的價值,所以缺少類型檢查並不重要。
您的原始解決方案啓用了有用的類型檢查。它告訴Perl 6確保$event
只包含NCurses::MEVENT
類型的對象。不幸的是,你沒有明確地初始化變量,所以它包含...
掛上。它包含了什麼? Perl 6不應該確保$event
中有一個NCurses::MEVENT
對象嗎?
其實它做到了!但不是把一個普通新的NCurses::MEVENT
對象在那裏Perl 6把一箇舊的NCurses::MEVENT
類型對象在那裏作爲佔位符。除此之外,Type對象表示未初始化對象的概念。 (有點像Perl 5中的「undef」。)
這種機制通常適用於像忘記適當初始化變量一樣的錯誤。但不是在這種情況下。那麼出了什麼問題?
回到getmouse
聲明。它應該是:
sub getmouse(MEVENT:D) ...
的:D
「式的笑臉」會告訴Perl 6中的參數必須是定義,即一個未初始化NCurses::MEVENT
不夠好。有了這個笑臉,你會得到一個適當的錯誤而不是沉默。
我已經在我的答案中更正了這一點。 –
是的 - 當發生這種情況時,我正在尋找解決方案並起草我的答案。非常感謝你接受我自己 - 我很高興你自己找到了它 - 我只是希望你在半小時後就這麼做了。 ;-) – Marty