繁体   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