
Toyland 程式設計
|
307
=> [
#<Sign positive>, #<Sign positive>, #<Sign positive>,
#<Sign positive>, #<Sign zero>, #<Sign positive>,
#<Sign positive>, #<Sign positive>, #<Sign positive>
]
>> outputs.uniq
=> [#<Sign positive>, #<Sign zero>]
沒有完成任何精巧的分析,這告訴我們,
#sum_of_squares
只會產生零或正數,絕不會產
生負數(這對受過教育的程式碼閱讀者顯然是個相當乏味的屬性),但這些不是機器可
以立即看出來。當然,這種技巧只能用在非常簡單的程式碼,但儘管是個玩具,它也證
明了抽象體可以讓困難的問題變得更容易駕馭。
靜態語意
截至目前,我們已經看到如何不需實際執行它們就能找出運算近似資訊的玩具範例。雖
然完成那些實際的運算可以讓我們學到更多,但是近似資訊比沒有更好,而且對某些應
用(例如路線規劃)來說,它可能全都是我們真正需要。
在乘法和加法的範例裡,我們只需將抽象值(而非具體數值)當作輸入傳給它,就能夠
將小程式轉換成更簡單、更為抽象的版本,但如果我們想鑽研更大更精細的程式,截至
目前我們就只能使用這種技術。如果想要建立能提供它們自己乘法和加法實作物的值,
是件很容易的事,但 Ruby 不允許值以更為普遍的方式控制它們自己的行為(例如在
if
陳述式使用它們), 因為它語法的特定部分應如何運作的規則已經寫死 ...