smalltalk - 什么是声明在方法声明中做什么?
问题描述
这是该类的asciiValue
方法Character
:
asciiValue
<primitive: 171>
^ self primitiveFailed
asciiValue 被发送到一个字符对象,例如 $A,并返回它的 ascii 代码。有人可以解释该asciiValue
方法是如何工作的吗?这是<primitive: 171>
从哪里来的,它的目的是什么?
解决方案
这是一个原始方法而不是常规 Smalltalk 方法的原因是Characters
在 Pharo 中是直接对象。
当在内存中看到时,对象是具有标题和一些附加字段的数据结构,每个实例变量一个。这些插槽包含指向当前绑定到 ivars 的对象的指针。
然而,在 的情况下SmallIntegers
,这种结构传统上被简化,因为具有 ivar 的对象 aSmallInteger
不指向小整数对象,它具有SmallInteger
. 这就是为什么SmallIntegers
称为直接对象的原因:您不指向它们,而是拥有它们。
当然,要实现立即值,您需要一种在内存中区分它们的方法。SmallIntegers
是整数,但内存指针也是整数。建立区别的技巧是观察所有对象都分配在 4(32 位)或 8(64 位)的倍数的地址中。这意味着指针的两个低位总是等于 0。因此,您可以使用这些备用位来标记立即对象并将立即值存储在剩余的较高位中。
在 Pharo 和其他方言的情况下,Characters
其代码点适合一个字节,可以很容易地标记,因此它们变得即时。这就是Characters
(and SmallIntegers
) 没有 ivars 的原因:它们是它们所代表的值,加上虚拟机的一些标签来区分。
因此,Smalltalk 映像无法访问 ASCII 的数值Character
,而是需要让 VM 读取它。这就是为什么 Pharo 需要一个原语来回答#asciiValue
消息的原因。
有关 Smalltalk 中原语的更多信息,请查看Smalltalk:原语是如何实现的?.
推荐阅读
- swift - 组合:不能将 `.assign` 与结构一起使用 - 为什么?
- python - 如何索引 pandas 查询表达式中的变量?
- vert.x - 在 vertx-web 背压示例中,为什么删除 observeOn 会增加延迟?
- angular - 合并来自主题的两个可观察对象过早完成
- javascript - TypeError:nodeIdListOfPrevValue.forEach 不是函数
- powerbi - Power Query / Power BI - 用另一列中的值替换空值
- build - 如何从 aosp 为 raspberri pi 构建 ROM
- javascript - DialogFlow:如何处理具有多个路由的 NodeJS 服务器?
- c++ - 在 C++ 中访问一个类的多个实例
- angular - 如何使基本 href / IIS 虚拟目录对 Angular 应用程序不区分大小写?