Smalltalk实例变量名和方法中允许哪些特殊字符?

Smalltalk实例变量名和方法中允许哪些特殊字符?,smalltalk,pharo,Smalltalk,Pharo,我记得在某处看到一种方法,实际上只允许名称中的字母‘大写’、‘小写’、数字和下划线,但我一生都找不到它 是否允许使用任何其他字符?如果要检查选择器名称中允许使用哪些字符,可以使用重构浏览器扫描程序并评估: RBScanner isSelector: 'invalid@Selector'. RBScanner isSelector: 'ValidSelector123_test'. RBScanner isSelector: '111selector123_test'. 这同样适用于实例变量名

我记得在某处看到一种方法,实际上只允许名称中的字母‘大写’、‘小写’、数字和下划线,但我一生都找不到它


是否允许使用任何其他字符?

如果要检查选择器名称中允许使用哪些字符,可以使用重构浏览器扫描程序并评估:

RBScanner isSelector: 'invalid@Selector'.
RBScanner isSelector: 'ValidSelector123_test'.
RBScanner isSelector: '111selector123_test'.
这同样适用于实例变量名

RBCondition checkInstanceVariableName: 'validInstVar' in: UndefinedObject.
" true, valid instance variable name "
RBCondition checkInstanceVariableName: 'super' in: UndefinedObject.
" false, super is a reserved word in Smalltalk "
RBCondition checkInstanceVariableName: '' in: UndefinedObject.
" false, empty instance variables are not allowed "
RBCondition checkInstanceVariableName: 'Invalid' in: UndefinedObject.
" false, instance variable must start with lowercase character "
或类变量

RBCondition checkClassVarName: 'invalidClassVar' in: UndefinedObject.
" false, because class variables must start with uppercase "
RBCondition checkClassVarName: 'super' in: UndefinedObject.
" false, the same "
RBCondition checkClassVarName: '' in: UndefinedObject.
" false, empty Class variables are not allowed "
RBCondition checkClassVarName: 'Valid' in: UndefinedObject.
" true, a valid class variable "

虽然OP最有可能意味着“常规可解析语法中允许的内容”,但我认为指出“Smalltalk文本语言”只是到达对象模型的一种中间文本表示形式是很有启发性的。如果您愿意发挥创造性,您实际上可以做一些语法难以支持的事情,因为语法的目标是解析的简单性

例如,可以使用以数字开头的方法:

Object methodDictionary at: #1a put: (Object >> #yourself) copy.
Object new perform: #1a
当您可以直接使用数字时,为什么要使用以数字开头的字符串

Object methodDictionary at: 42 put: (Object >> #yourself) copy.
Object new perform: 42
或者只是空字符串怎么样

Object methodDictionary at: #'' put: (Object >> #yourself) copy.
Object new perform: #''
您的浏览器可能会也可能不会优雅地处理添加到系统中的这些方法


可以使用实例变量执行类似的操作

哇。。。它甚至必须以小写字母开头。六羟甲基三聚氰胺六甲醚。。。非常感谢。以大写字母开头的选择器有效。一般规则是,选择器必须以字母字符开头,后跟0或更多数字或字母,二进制选择器除外,二进制选择器必须是!%&*+,-/?@\~。您可以在RBScanner initializeClassificationTable中检查这一点。出色的贡献。让我们补充一下,您还可以在新方法中修改选择器ivar,使其与键相对应。然而,这并不是强制性的。@LeandroCaniglia“修改选择器ivar以对应于键”,而不是我假设的值,实际实现了什么?键和值字段中分别存储了什么?在Smalltalk中,方法存储在
方法字典
,这是一种特殊的
字典
,其中键是
符号
,值是
编译方法
。通常键是CM的选择器,然而,正如Travis在他的示例中所示,这不是强制性的:
Object>#yourself
的副本是一个带有选择器
#yourself
的CM,该选择器与其他键相关联,例如
#1a
42
'
(还要注意,
42
甚至不是
符号
!)。该方法无论如何都能工作,尽管这不是通常的安排。我的评论是关于更改复制方法的选择器。@LeandroCaniglia,CompiledMethods没有
选择器
ivar。Pharo将选择器的文本存储在方法字节码中(不知道为什么).VisualWorks将绑定回类,并查找方法的键。在VW中,选择器将自动跟踪。在Pharo中,您肯定需要执行一些有趣的juju来更新选择器(至少粉碎literaat:).你是对的。但是请注意,Dolphin和VSE中有一个
选择器
ivar(不确定其他方言)正如您所指出的,在Pharo中,选择器位于方法的文本框架中,我想,用于快速检索;顺便说一句,这与ivar中的选择器非常相似。无论如何,在Pharo中,如果您向他们发送
选择器
消息,您的示例将使用
#您自己
,即使它们与MD中的键没有关联。