Squeak Smalltalk,为什么有时简化方法不';不行?
看看上面的代码。第一个和第二个在打印时不起作用。此时会弹出消息NotUnderstanding窗口。第三、第四、第五个代码都可以。结果是正确的 为什么Squeak Smalltalk,为什么有时简化方法不';不行?,smalltalk,fractions,squeak,Smalltalk,Fractions,Squeak,看看上面的代码。第一个和第二个在打印时不起作用。此时会弹出消息NotUnderstanding窗口。第三、第四、第五个代码都可以。结果是正确的 为什么reduced方法不起作用 是因为简化方法无法处理像Uko猜测那样的整数的最终结果吗 分数在/方法中自动减少。无需发送reduced消息 例如,如果您打印 (2332 / 2332) reduced (2332 / 2) reduced (2332 / 322) reduced (1166/161) (2332 / 3) reduced (
reduced
方法不起作用
是因为简化方法无法处理像Uko猜测那样的整数的最终结果吗 分数在
/
方法中自动减少。无需发送reduced
消息
例如,如果您打印
(2332 / 2332) reduced
(2332 / 2) reduced
(2332 / 322) reduced (1166/161)
(2332 / 3) reduced (2332/3)
(2332 / 2432423) reduced (2332/2432423)
2 / 4
您将自动获得减少的(1/2)
如果您打印
(2332 / 2332) reduced
(2332 / 2) reduced
(2332 / 322) reduced (1166/161)
(2332 / 3) reduced (2332/3)
(2332 / 2432423) reduced (2332/2432423)
2 / 4
它被简化为1
,它不是一个分数,而是一个整数,整数不理解reduced
消息。这就是为什么会出现错误
分数未自动减少的唯一情况是手动创建分数,如中所示
2332 / 2332
这将回答非简化的
(2/4)
。但是在正常的算术表达式中,您永远不需要发送reduced
,因为默认情况下,Integer
类不理解Squeak中的消息reduced
。尽管Squeak的Integer
类的成员是分数,但仍然存在这种情况
Smalltalk的奇妙之处在于,如果某件事不能按你想要的方式工作,你可以改变它。因此,如果Integer
没有响应消息reduced
,并且您希望它响应,那么您可以向Integer
添加一个reduced
方法,该方法具有预期的行为:
5 isFraction "returns True"
向类添加方法是Smalltalk使编写表达性程序变得容易的方式。例如,GNU Smalltalk中的分数理解消息reduce
,但不理解Squeak中可用的消息reduced
。程序员可以简单地使GNU Smalltalk中的分数可用reduced
,而不是试图记住无意义的差异:
reduced
"treat an integer like a fraction"
^ self
同样,可以在Squeak中扩展分数
,以使用减少
方法:
Fraction extend [
"I am a synonym for reduce"
reduced [
^ self reduce
]
]
Smalltalk的设计者设计了一种语言,让程序员用他们思考问题的方式来表达自己。也许(2332/2332)的结果是一个整数?(它不理解reduced
我想Uko是想给你一个提示……仔细看一下消息NotUnderstand,你应该能够自己弄清楚这一点。@Uko当传递消息isFraction
@benrudgers时,如果它是整数并且响应真的
到isFraction
我想说这是一个错误,因为你不能用任何整数替换每一个分数,并让它工作。isFraction的实现isFraction
解释了理性。integer
根据Smalltalk规范也有地板
和天花板
。一个人的bug是艾伦·凯、丹·英格尔和阿黛尔·戈德伯格的一项功能。是的,你可以这样做,但既然“reduced”是一种私密的分数方法,就真的没有必要了。@BertFreudenberg一个整数如何理解reduced
否则呢?@BertFreudenberg将内置功能视为特权遗漏了Smalltalk的观点。Hi Ben,@Bertenberg是对的。虽然修改基类是可以的,但通过添加选择器来解决问题并不太好,否则会生成MNU。在这种特殊情况下,问题是由于错误使用了#reduced
,因此解决方案是避免此类错误使用,而不是添加me方法Integer
。你熟悉吗?@LeandroCaniglia我熟悉XY问题。这不是问题。向类添加消息是Smalltalk的必要条件。你可以移植“非语音”文化对于Smalltalk,但这并不意味着它是一个好主意。可以将Smalltalk当作静态类型来编写,这也不是一个好主意。Integer
易于修改的原因是因为Smalltalk的设计师认为它是编写表达性程序的一个好方法。您熟悉Blub语言吗?Integer
s对消息isFraction
作出响应True
。请记住,一个好的堆栈溢出问题的一个特点是将代码减少到说明问题的最小值。