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



我记得在某个地方看到一个方法,它实际上只允许在名称中使用字母"大写"、"小写"、数字和下划线,但我一辈子都找不到它了。

是否允许使用其他字符?

如果您想检查选择器名称中允许哪些字符,可以使用RefactongBrowser扫描程序并评估:

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: #''

您的浏览器可能会也可能不会优雅地处理添加到系统中的这些方法。

可以对实例变量进行类似的操作。

最新更新