2015-02-17 31 views

Odpowiedz

5

Jeśli chcesz sprawdzić, jakie znaki są dozwolone w nazwach selektora można użyć skanera RefactoringBrowser i ocenić:

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

to samo odnosi się do instancji nazwy zmiennych

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 " 

lub klasy zmienne

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 ... musi zaczynać się od małej litery. Hmmm ... dziękuję! – unmircea

+0

Selektory zaczynające się od dużej litery są ważne. Ogólna reguła jest taka, że ​​selektory muszą rozpoczynać się od znaku alfabetycznego i śledzić za pomocą 0 lub więcej cyfr lub alfa, z wyjątkiem selektorów binarnych, które muszą być sekwencją!% & * +, -/<=>? @ \ ~ |. Możesz to sprawdzić w initializeClassificationTable RBScanner. –

3

O ile PO najwyraźniej oznaczał "co wolno w regularnej składni parsable ", myślę, że pouczające jest wskazanie, że" Smalltalk Textual Language "jest po prostu pośrednią reprezentacją tekstową, aby dostać się do modelu obiektowego. Jeśli chcesz być kreatywny, możesz faktycznie robić rzeczy, których składnia z celami parsowania prostoty będzie trudna do obsłużenia.

Na przykład można mieć metody, które rozpoczynają się od cyfr:

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

Dlaczego ciągi liczb, które zaczynają się, kiedy można po prostu bezpośrednio używać liczb?

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

A może po prostu puste struny?

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

Twoja przeglądarka może, ale nie musi radzić sobie wdzięcznie z tymi metodami dodawanymi do twojego systemu.

Podobne manipulacje można wykonywać za pomocą zmiennych instancji.

+0

Doskonały wkład. Dodajmy, że można również zmodyfikować selektor ivar w nowej metodzie, tak aby odpowiadał kluczowi. To jednak nie jest obowiązkowe. –

+0

@ LeandroCaniglia Co "modyfikując selektor ivar, aby odpowiadał kluczowi", zamiast wartości, którą zakładam, faktycznie osiągnąć? Co jest przechowywane odpowiednio w polach klucza i wartości? – unmircea

+1

W Smalltalk metody są przechowywane w 'MethodDictionaries', szczególnym rodzaju' Dictionary', gdzie kluczami są 'Symbole', a wartościami są' CompiledMethods'. Zwykle kluczem jest selektor CM, jednak jak pokazuje Travis w swoich przykładach, nie jest to obowiązkowe: kopia 'Object >> # yourself' jest CM z selektorem' # yourself', który jest powiązany z innymi kluczami takie jak '# 1a',' 42' lub '# ''' (zwróć uwagę, że '42' nie jest nawet' Symbolem'!). Metoda i tak zadziała, nawet myśl, że to nie jest zwykła aranżacja. Mój komentarz dotyczył zmiany selektora skopiowanej metody. –