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

时间:2015-02-17 18:07:15

标签: smalltalk pharo

我记得在某个地方看到的方法实际上只允许字母'大写'小写'小写',数字和名称中的下划线,但我无法再找到它为了我的生命。

是否允许任何其他角色?

2 个答案:

答案 0 :(得分:5)

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

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 "

答案 1 :(得分:3)

虽然OP很可能意味着“常规可解析语法中允许的内容”,但我认为指出“Smalltalk Textual Language”只是一个中间文本表示来获取对象模型是有益的。如果你愿意发挥创造力,你实际上可以做的事情是,解析简单性的目标语法难以支持。

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

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

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

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