[英]Squeak Smalltalk, why sometimes the reduced method doesn't work?
(2332 / 2332) reduced
(2332 / 2) reduced
(2332 / 322) reduced (1166/161)
(2332 / 3) reduced (2332/3)
(2332 / 2432423) reduced (2332/2432423)
看上面的代碼。 第一個和第二個在打印時不起作用。 彈出MessageNotUnderstood窗口。 而且第3,第4,第5代碼都可以。 結果正確。
為什么reduced
方法不起作用?
是否因為歸約方法無法處理最終結果(如Uko猜測的整數)?
/
方法中的分數會自動減少。 無需發送reduced
消息。
例如,如果您打印的結果
2 / 4
您會自動獲得縮小的(1/2)
。
如果打印結果
2332 / 2332
它減少為1
, 不是分數,而是整數,並且整數不理解reduced
消息。 這就是為什么您會得到一個錯誤。
分數不會自動減少的唯一情況是手動創建分數,如
Fraction numerator: 2 denominator: 4
這將回答未歸約(2/4)
。 但是在普通的算術表達式中,您無需發送reduced
。
發生錯誤是因為默認情況下, Integer
類不理解Squeak中reduced
的消息。 盡管Squeak的Integer
類的成員都是分數。
5 isFraction "returns True"
Smalltalk的妙處在於,如果某些事情無法按您想要的方式工作,則可以對其進行更改。 因此,如果Integer
不響應reduced
的消息而您希望它響應,則可以使用預期的行為向Integer
添加一個reduced
方法:
reduced
"treat an integer like a fraction"
^ self
將方法添加到類是Smalltalk簡化編寫表達性程序的方式。 例如,GNU Smalltalk中的Fractions
理解消息reduce
但Squeak中不可用消息reduced
。 程序員不必試圖記住無意義的區別,而可以簡單地將reduced
提供給GNU Smalltalk中的分數:
Fraction extend [
"I am a synonym for reduce"
reduced [
^ self reduce
]
]
同樣,可以將Squeak中的Fraction
擴展為reduce
方法:
reduce
"I am a synonym for reduced"
^ self reduced
Smalltalk的設計師設計了一種語言,使程序員可以以思考問題的方式來表達自己。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.