理解smalltalk中的以下代码

Understanding the following piece of code in smalltalk

我正在尝试理解 smalltalk 中的以下代码

Character extend [
   isGraph [
      ^ (Character space < self) & (self <= $~)
   ]
   visible [
      self isGraph ifTrue: [^ '$', self asString]
                   ifFalse: [^ self asInteger printStringRadix: 16]
   ]
]

基本上,该代码所做的是通过向其添加两个新函数来扩展字符的功能。 IsGraph returns 一个布尔值,但我不明白它的用途。您如何解释 (Character space < self) & (self <= $~)?。消息 space 以某种方式发送给角色,然后 returns 与 self 比较的东西,然后 self 与 $~ 比较。也有人可以解释 iftrue 块中符号 ',' 的含义吗?

欢迎使用 Whosebug。

首先,代码添加了两个新方法而不是函数,因为这是面向对象的编程。

当您将 space 消息发送到 Character class 时,它将 return 您一个实例,如果 class 代表 space 字符。 isGraph 可能表示 "is graphical" 因为 ASCII table 中 space 之前的字符也没有图形表示(它们是 NULL、CR、ESC 等)作为 ~ 之后的 DEL 字符。因此,使用 isGraph,您可以检查 ASCII table.

上的字符是否在 space 和 ~ 之间

visible return 是字符的可见表示,并依赖于 isGraph 来决定是 return 实际字符还是它的整数 ASCII 表示。实际字符以 Smalltalk 的字符文字格式 returned,例如$a用于字符a</code>用于字符<code>3。字符串与 , 消息连接。

其实Smalltalk的一大亮点就是易懂。因此,您应该始终能够调试一小段代码或查看消息的实现(例如 , 在您的情况下)。但我怀疑您使用的 GNU Smalltalk 之类的东西缺少许多这些功能。