2017-10-19 4 views
1

Si j'ai une classe commeDifférence dans l'affectation des variables à l'intérieur et à l'extérieur du superbloc dans une sous-classe Ruby Thread?

class CustomThread < Thread 
    def initialize 
    @outside = [] 
    super do 
     @inside = [] 
    end 
    end 

    def push(value) 
    @outside.push(value) 
    @inside.push(value) 
    end 
end 

Quelle est la différence pour le comportement de @outside vs @inside? Comment puis-je déterminer quelles variables affecter en dehors du super-bloc par rapport à l'intérieur de celui-ci?

Répondre

0

super appelle la même méthode à partir de la classe parent. Vous appelez donc Thread#initialize et passez un bloc qui attribue @inside. Le docs nous dit que cela crée un nouveau thread exécutant le bloc donné. Par conséquent, la différence est que @outside est affectée lorsqu'un CustomThread est créé, alors que @inside est affecté ultérieurement à la fin du thread. C'est donc une condition de course:

CustomThread.new.push_value 0 

parce @inside pourrait ne pas avoir été affecté par le temps push_value essaie de pousser à lui. Pour l'utiliser en toute sécurité, vous devez faire

thread = CustomThread.new 
thread.join 
thread.push_value 0