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