Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Squeak Smalltalk,为什么有时简化方法不';不行?_Smalltalk_Fractions_Squeak - Fatal编程技术网

Squeak Smalltalk,为什么有时简化方法不';不行?

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 (

看看上面的代码。第一个和第二个在打印时不起作用。此时会弹出消息NotUnderstanding窗口。第三、第四、第五个代码都可以。结果是正确的

为什么
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
。请记住,一个好的堆栈溢出问题的一个特点是将代码减少到说明问题的最小值。