a := 12 / 24.
a是分配了分数12 / 24
的变量。打印时,1 / 2
是答案。现在打开检查弹出窗口,我改变分子和分母的值,并猜测答案与以前相同,1 / 2
。真正发生的是输出保持12 / 24
,这对我来说很奇怪。
我录制了一段视频来帮助您理解这个问题。
https://www.youtube.com/watch?v=LNj24f2wP0M
为什么在检查窗口中修改分子和分母值后才会减少分数?
答案 0 :(得分:3)
您描述的行为是正确的,是预期的行为。
作为开发人员,您可以通过两种方式修改对象:
方法1是首选,因为它符合范例。那么,为什么我们有方法2?因为当您打开检查器时,您会以某种方式模拟对象。换句话说,您成为受检查的对象,因此您有权自行修改。
当然,如果您修改内部状态,则由您来保留不变量。在分数的情况下,有两个不变量:
(numerator gcd: denominator) = 1
SELECT c.Email, o.RoleDesc
FROM c
JOIN o IN c.OrgRoles
WHERE c.Email = "jim@test.com"
{
"id": "23452345234",
"Email": "jim@test.com",
"OrgRoles": [
{
"RoleID": "234234",
"RoleDesc": "worker"
},
{
"RoleID": "345678",
"RoleDesc": "Manager"
},
{
"RoleID": "456433",
"RoleDesc": "Admin"
}
],
"DeviceIDs": [
{
"Device": "ABC-12312"
},
{
"Device": "DEF-76576"
}
],
"UpdatedDate": "01-12-17",
"CreatedDate": "01-11-17",
"_rid": "KFokAIrg-QABAAAAAAAAAA==",
"_self": "dbs/KFokAA==/colls/KFokAIrg-QA=/docs/KFokAIrg-QABAAAAAAAAAA==/",
"_etag": "\"00002d00-0000-0000-0000-59ef0f7f0000\"",
"_attachments": "attachments/",
"_ts": 1508839295
}
总而言之,检查员会假设您知道自己在做什么,并允许您按照自己的方式修改所有实例变量。但是,在发送消息时,对象应该以保持其不变量的方式运行。
当然,有些私人方法应该小心处理(即,只能通过公共方法发送),但一般的想法是直接操纵物体是一件好事,并没有任何障碍或保障。
答案 1 :(得分:2)
我的回答是基于Pharo方言,我相信吱吱声并不是很强烈。 因为你是第一次划分整数。 有来自Integer>> /
的代码段(Fraction numerator: self denominator: aNumber) reduced
注意调用reduce方法。
如果在Inspector工具中更改分母/分母后调用reduce方法,则分数对象也将减少。