Proč nemohu vytvořit novou podtřídu a používat jej v jedné větě?

hlasů
1

Já jsem přemýšlel, proč tyto nefunguje v GNU Smalltalk:

Object subclass: Foo [ ] new printNl

Čekal jsem, že výtisk něco jako „z Foo“, ale místo toho GST otisky „bezpředmětné“. Není to zdát trochu divné?

Položena 12/03/2009 v 11:04
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Object subclass: Foo []není „obvyklý“ syntax Smalltalk, to je Posledním přírůstkem navržena tak, aby to praktický kódu v souborech. Předtím nebylo věnováno syntax deklarovat třídu, protože by být vytvořeny pomocí příkazu v obraze. Interpretace tohoto kódu podle očekávání by bylo špatné z několika důvodů:

  • Za prvé, pokud subclass:byla skutečná zpráva odeslána Object, pak Fooby měla vyřešit na něco, což není možné, protože to je právě deklarována. Nicméně, v zákulisí, kompilátor dělá něco podobného Object subclass: #Foo, kde #Fooje symbolem pro název nové třídy, které mají být vytvořeny. Bylo by možné zapisovat všechny kód, jako je to, že s výjimkou pak jste nemohli používat názvy tříd přímo (jelikož neexistují dosud při čtení kódu). Budete muset dělat (Smalltalk at: #Foo) new printNlvšude možně. Takže celá forma Object subclass: Foo [ ]je čistá syntax, že právě prohlašuje, že by měl být vytvořen do této třídy, a neznamená to, že v tomto okamžiku zpráva by měla být zaslána Object, etc

  • Za druhé, nechcete vytvářet třídy uprostřed algoritmu a okamžitě posílat zprávy, že by bylo dost ošklivé jako vývojový praxi. Všimněte si, že třída musí být zaregistrován v systému tak, že prohlížeč je může zobrazovat, že překladač může automaticky překompilovat závislostmi, že pro správu verzí je možné zaznamenat, atd. Také, co když váš kód náhodou běží to dvakrát? Byste měli dostat druhou třídu Foo a zapomenout na ten předchozí? Takže, obvykle jen překladač, prohlížeč a další meta-programovací nástroje pro vytváření nové třídy, a to pouze na základě žádosti programátora.

Odpovězeno 09/04/2009 v 20:07
zdroj uživatelem

hlasů
2

To je interpretováno jako dva příkazy. Prvním z nich je

podtřída objekt Foo []

a druhý je

nový printNl

kde je definována nová proměnná, takže je nulová.

Odpovězeno 12/03/2009 v 17:27
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more