Je veux savoir comment whileTrue:
travaux. J'ai cherché à la mise en œuvre qui est dans BlockClosure
:
whileTrue: aBlock
^ [self value] whileTrue: [aBlock value]
Et une autre mise en œuvre sans paramètre:
whileTrue
^ [self value] whileTrue: []
Mais je ne sais pas comment cela fonctionne, c'est une méthode récursive, mais cela m'a amené à poser plusieurs questions:
[self value]
retourne un objet Boolean
, pourquoi est whileTrue:
Non implémenté dans le type Boolean
?whileTrue
qui ne reçoit tout simplement pas de bloc et évalue self
?Mon smalltalk est un peu rouillé, et je n'ai pas de smalltalk installé pour le moment, il pourrait donc y avoir des erreurs de syntaxe ici, mais vous obtenez l'idée:
whileTrue: aBlock
↑ self value ifTrue: [aBlock value. self whileTrue: aBlock]
Voici une version in Ruby== que j'ai réellement testé, dont ce qui précède (j'espère) est une traduction:
class Proc
def vhile(block)
self.().iff(thn: -> {block.(); vhile(block)})
end
end
Vous avez besoin des sockeyPatches suivantes pour que les contenus de style SmallTalk soient au travail:
class TrueClass
def iff(thn:, els: ->{})
thn.()
end
end
class FalseClass
def iff(thn:, els: ->{})
els.()
end
end