2017-07-04 3 views
4

Je suis en train de faire un tableau avec des nombres aléatoires (seulement 0 ou 1), mais quand je le lance, il imprime ceci: Fin de la liste des états rencontrés ->Pour boucle pour tableau dans Pharo Smalltalk

Ceci est mon code:

GenList 
| lista | 
    lista := Array new: 31. 
    1 to: 30 do: [ :i | lista at: i put: 2 atRandom - 1] 
    ^lista 

Que puis-je faire?

+1

Il vous manque un point (fin de l'instruction) après la 4ème ligne. –

+2

Il n'y a pas non plus de point dans la construction de tableau ... vous pouvez faire '^ (1 à: 30) collecter: [: i | 2 atRandom - 1] ' –

Répondre

12

Certaines choses intéressantes à considérer:


1. Le sélecteur de méthode ne commence pas par une lettre minuscule


Il est une tradition pour les sélecteurs de commencer par une minuscule lettre. En ce sens, genLista serait plus correct que GenLista.


2. Le sélecteur de méthode inclut le mot abrégé 'gen'


Par exemple, genLista pourrait être renommé genereLista o listaAlAzar (si vous décidez d'utiliser l'espagnol)


3. Le Array nommé lista possède 31 éléments, et non 30


Le résultat de Array new: 31 est un tableau de 31 éléments. Cependant, le code ci-dessous n'en remplit que 30, laissant le dernier non initialisé (c'est-à-dire nil). Solution possible: lista := Array new: 30.


4. Un point est manquant provoque une erreur de compilation


Le code

1 to: 30 do: [ :i | lista at: i put: 2 atRandom - 1] 
    ^lista 

ne compile pas parce qu'il n'y a pas de point indiquant la séparation entre les deux phrases . Notez que l'erreur se produit au moment de la compilation (c'est-à-dire lorsque vous enregistrez la méthode) car le jeton de retour ^ doit démarrer une instruction (c'est-à-dire qu'il ne peut pas être inséré dans une instruction).

Il existe d'autres cas où un point manquant n'empêche pas la compilation du code. Au lieu de cela, une erreur se produira à l'exécution. Voici un (typique) exemple:

1 to: 10 do: [:i | self somethingWith: i]  "<- missing dot here" 
self somethingElse 

le point manquant génère l'erreur d'exécution self not understood by block.


5.Il y a une façon plus expressive de générer 0 et de 1 au hasard


Le calcul 2 atRandom - 1 est ok. Cependant, cela oblige le lecteur à faire les calculs mentalement. Une meilleure façon de révéler votre intention aurait été

#(0 1) atRandom 

6. Lorsque vous jouez avec des nombres aléatoires ne pas oublier de sauvegarder la graine


Bien qu'il soit autorisé à utiliser atRandom, une telle pratique devrait seulement être utilisée avec le code "jouet". Si vous développez un système ou une bibliothèque, la pratique recommandée consiste à enregistrer la graine quelque part avant de générer des données aléatoires. Cela vous permettra de reproduire plus tard la génération de quantités aléatoires pour le débogage ou la confirmation. (Notez cependant que cela ne suffira pas à rendre votre programme reproductible de manière déterministe car des collections non ordonnées (par exemple hachées) pourraient se former différemment dans les exécutions successives.)