簡體   English   中英

吱吱作響的小話,為什么有時簡化的方法不起作用?

[英]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.

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