Squeak Smalltalk,为什么有时reduced方法不起作用?

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 window 弹出。而第3、4、5码都可以。结果出来了。

为什么 reduced 方法不起作用?

是不是因为reduced方法无法处理像Uko猜测的整数的最终结果?

/ 方法会自动减少分数。无需发送 reduced 消息。

例如如果你打印

的结果
2 / 4

您会自动获得减少的 (1/2)

如果打印

的结果
2332 / 2332

它被简化为 1,它 不是 一个分数,而是一个整数,而整数不理解 reduced 消息。这就是您收到错误的原因。

分数不会自动减少的唯一情况是您手动创建它,如

Fraction numerator: 2 denominator: 4

这将回答非缩减的(2/4)。但是在普通的算术表达式中,你永远不需要发送 reduced.

错误的发生是因为默认情况下,Integer class 不理解 Squeak 中的消息 reduced尽管 Squeak 的 Integer class 成员是分数。

5 isFraction "returns True"

Smalltalk 的美妙之处在于,如果某些东西无法按您希望的方式工作,您可以更改它。因此,如果 Integer 没有响应消息 reduced 而你希望它响应,那么你可以将 reduced 方法添加到 Integer 并具有预期的行为:

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 的设计者创造了一种语言,让程序员能够以他们思考问题的方式表达自己。