以下是Squeak 4.1中的分割方法:
/t1
| t2 |
t1 isInteger
ifTrue: [t2 := self digitDiv: t1 abs neg: self negative ~~ t1 negative.
(t2 at: 2)
= 0
ifTrue: [^ (t2 at: 1) normalize].
^ (Fraction numerator: self denominator: t1) reduced].
^ t1 adaptToInteger: self andSend: #/
我不懂代码。你能给我一些关于如何调试代码的提示,所以我可以跟踪代码行为吗?就像打开工作区一样,键入4/3,我可以检查Fraction。有对象self,numerator,denominator等。我怎样才能进入4/3,看看Smalltalk如何实现除法?
答案 0 :(得分:6)
首先,你的消息来源有问题。方法整数>> / 实际上如下所示:
/ aNumber
"Refer to the comment in Number / "
| quoRem |
aNumber isInteger ifTrue:
[quoRem := self digitDiv: aNumber abs "*****I've added abs here*****"
neg: self negative ~~ aNumber negative.
(quoRem at: 2) = 0
ifTrue: [^ (quoRem at: 1) normalize]
ifFalse: [^ (Fraction numerator: self denominator: aNumber) reduced]].
^ aNumber adaptToInteger: self andSend: #/
其次,此代码仅用于大整数。如果您评估4 / 3
,则不使用此方法,而是直接创建分数的 SmallInteger>> / 。
要调用所需的方法,您需要使用大数字,例如:
12345678901234567890 / 2
选择此表达式,然后从上下文菜单中选择“调试它”。或者,您可以使用“暂停”消息来调用调试器:
12345678901234567890 halt / 2
当弹出调试器时,单击其“进入”按钮以进入该方法。