2015-02-17 9 views

Antwort

5

Wenn Sie überprüfen möchten, welche Charaktere in Selektornamen dürfen Sie den RefactoringBrowser Scanner verwenden könnte und zu bewerten:

RBScanner isSelector: '[email protected]'. 
RBScanner isSelector: 'ValidSelector123_test'. 
RBScanner isSelector: '111selector123_test'. 

das gleiche gilt für Instanzvariablennamen

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 " 

oder Klassenvariablen

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 " 
+0

Wow ... es muss sogar mit einem Kleinbuchstaben beginnen. Hmmm ... danke! – unmircea

+0

Selektoren, die mit einem Großbuchstaben beginnen, sind gültig. Die allgemeine Regel ist, dass Selektoren mit einem alphabetischen Zeichen beginnen und mit 0 oder mehr Ziffern oder Alpha folgen müssen, außer für binäre Selektoren, die eine Sequenz von!% & * +, -/<=>? @ \ ~ | Sein müssen. Sie können dies in RBScanner initializeClassificationTable überprüfen. –

3

Während das OP höchstwahrscheinlich bedeutete "was erlaubt ist in der regulären syntaktischen Syntax ", ich denke, es ist aufschlussreich, darauf hinzuweisen, dass die" Smalltalk Textual Language "nur eine Zwischentextdarstellung ist, um zu einem Objektmodell zu gelangen. Wenn Sie bereit sind, kreativ zu sein, können Sie tatsächlich Dinge tun, die die Syntax mit ihren Zielen der Analyse von Einfachheit schwer unterstützen würde.

Zum Beispiel können Sie Methoden, die mit Zahlen beginnen:

Object methodDictionary at: #1a put: (Object >> #yourself) copy. 
Object new perform: #1a 

Warum Strings haben, die mit Zahlen beginnen, wenn Sie nur Zahlen direkt verwenden können?

Object methodDictionary at: 42 put: (Object >> #yourself) copy. 
Object new perform: 42 

Oder wie wäre es nur mit leeren Saiten?

Object methodDictionary at: #'' put: (Object >> #yourself) copy. 
Object new perform: #'' 

Ihr Browser kann mit diesen Methoden, die zu Ihrem System hinzugefügt werden, ordnungsgemäß behandelt werden oder auch nicht.

Ähnliche Manipulationen können mit Instanzvariablen durchgeführt werden.

+0

Ausgezeichneter Beitrag. Fügen Sie hinzu, dass Sie auch das Selektor-Ivar in der neuen Methode so ändern können, dass es dem Schlüssel entspricht. Dies ist jedoch nicht zwingend erforderlich. –

+0

@LeandroCaniglia Was würde "den Selektor zu ändern, um dem Schlüssel zu entsprechen" anstatt den Wert, den ich vermute, tatsächlich erreichen? Was ist in den Schlüssel- bzw. Wertfeldern gespeichert? – unmircea

+1

In Smalltalk werden Methoden in 'MethodDictionaries' gespeichert, einer speziellen Art von' Dictionary', wo die Schlüssel 'Symbols' sind und die Werte' CompiledMethods' sind. Gewöhnlich ist der Schlüssel der Selektor des CM, aber, wie Travis in seinen Beispielen zeigt, ist das nicht zwingend: Die Kopie von 'Object >> # yourself' ist ein CM mit Selektor' # yourself', der anderen Schlüsseln zugeordnet ist wie "# 1a", "42" oder "#" (beachte auch, dass "42" nicht einmal ein "Symbol" ist!). Die Methode wird trotzdem funktionieren, auch wenn das nicht die übliche Anordnung ist. In meinem Kommentar ging es darum, den Selektor der kopierten Methode zu ändern. –

Verwandte Themen