Squeak Smalltalk,为什么有时减少的方法不起作用?

时间:2017-10-25 21:09:31

标签: smalltalk fractions squeak

(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猜测的整数?

1 个答案:

答案 0 :(得分:-1)

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

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