Next Previous Contents

24. <6.3.1>: Verdioverføring og referanseoverføring

Overføring av parametre og returverdier i distribuerte systemer kan deles i to hovedkategorier: verdioverføring (pass-by-value) og referanseoverføring (pass-by-reference).

Standard i druby er at objekter sendes ved verdioverføring. Objektene serialiseres (se Marshal-modulen), sendes over nettet og en kopi opprettes på mottakerens side. Dersom objektet ikke kan serialiseres/marshalles, fanges unntaket og det sendes over en referanse. Mottakeren ender da opp med en DRbObject-instans som videresender metodekall over nettet.

  1| require 'drb'
  2| $hvor = 'i stua'
  3| 
  4| class Videospiller  
  5|   
  6|   include DRbUndumped   # Gjør slik at Videospiller ikke kan serialiseres.
  7|   def start
  8|     puts "Videospiller: 'Press play on tape #{$hvor}.'"
  9|   end
 10| 
 11|   class Kontroll 
 12|     def initialize( spiller )
 13|       @spiller = spiller
 14|     end    
 15|     def hvor_er_du?
 16|       puts "Kontroll: 'Jeg er #{$hvor}.'"
 17|     end
 18|     def start
 19|       @spiller.start
 20|     end
 21|   end # Kontroll
 22| 
 23| end # Videospiller
 24| 
 25| class Tjener 
 26|   def initialize
 27|     @spiller = Videospiller.new
 28|   end
 29|   def ny_fjernkontroll     # pass-by-value
 30|     Videospiller::Kontroll.new( DRbObject.new( @spiller ) )  
 31|   end
 32|   def ny_kontroll          # pass-by-reference
 33|     Videospiller::Kontroll.new( @spiller )
 34|   end
 35|   def hent_streng   # pass-by-value
 36|     'En streng, en streng, mitt kongerike for en streng.'
 37|   end
 38|   def hent_standard_utput  # pass-by-reference da IO er en av
 39|     $stdout                # klassene som ikke kan serialiseres.
 40|   end
 41| end
 42| 
 43| if __FILE__ == $0 then # Start tjeneren med våre utvidelser, og
 44|   load 'drb_server.rb' # gjenbruker koden fra forrige eksempel.
 45| end

  1| require 'drb_videospiller'    # Trenger definisjonen til Kontroller
  2| $hvor = 'på soverommet'
  3| DRb.start_service
  4| vcr_tjener = DRbObject.new( nil, 'druby://localhost:4242' )
  5| 
  6| $tjener_utput = vcr_tjener.hent_standard_utput 
  7| def puts_begge_steder( tekst )
  8|   puts tekst
  9|   $tjener_utput.puts tekst
 10| end
 11| 
 12| puts_begge_steder('--Fjernkontrollen kan vi ta med inn på soverommet')
 13| fjernkontroll = vcr_tjener.ny_fjernkontroll
 14| p fjernkontroll
 15| fjernkontroll.hvor_er_du?  #=> Kontroll: 'Jeg er på soverommet.'
 16| fjernkontroll.start        #=> Videospiller: 'Press play on tape i stua.'
 17| 
 18| puts_begge_steder('--Mens kontrollen som er tett knyttet til ' +
 19|                   'videospilleren må forbli i stua.')
 20| # Så vi får bare en referanse til, og ikke en kopi av, kontrollen.
 21| kontroll = vcr_tjener.ny_kontroll
 22| p kontroll
 23| kontroll.hvor_er_du?       #=> Kontroll: 'Jeg er i stua.'
 24| kontroll.start             #=> Videospiller: 'Press play on tape i stua.'

druby og videospiller/tvslave-eksemplet


Next Previous Contents