2016-05-10 9 views
0
class Tour 
    def destinations 
    threads = [] 
    [:new_york, :london, :syndey].each { |city| 
     @threads << Thread.new { 
     where = city 
     goto(where) 
     } 
    } 
    threads.each(&:join) 
    end 

    def where=(location) 
    Thread.current[:city] = location 
    end 

    def where 
    Thread.current[:city] 
    end 

    def goto(city) 
    puts "I am going to visit #{city}." 
    end 
end 

Tour.new.destinations 

Um die Thread-Lokalvariable in Methode goto zuzugreifen(), der die Thread-Lokalvariable ist, um es wie goto(where) übergeben werden, wenn es viele andere ähnlichen Verfahren tun müssen, Dinge, die auf der aktuellen Thread-Lokalvariablen basieren: Stadt, dann muss sie auch an andere Methoden übergeben werden.rubin lokaler Thread variable Zugriff von anderen Methoden

Ich denke, es gibt eine elegante/Ruby-Methode zu vermeiden Thread lokalen Variable als Option zu übergeben, wie sieht das aus?

+0

Treat es weniger wie eine imperative Sprache und mehr wie eine objektorientierte Sprache. Objekte sind der Weg dorthin! –

Antwort

4

Das scheint, als würdest du dich selbst viel stolpern. Es ist möglicherweise besser, ein neues Objekt für jeden Thread zu initialisieren.

class Tour 
    def self.destinations 
    threads = [] 

    [:new_york, :london, :sydney].each do |city| 
     threads << Thread.new { Destination.new(city).go } 
    end 

    threads.each(&:join) 
    end 
end 

class Destination 
    attr_reader :location 

    def initialize(location) 
    @location = location 
    end 

    def go 
    puts "I am going to visit #{location}." 
    end 
end 

# Tour.destinations 

nachlesen: https://blog.engineyard.com/2011/a-modern-guide-to-threads

Verwandte Themen