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.' |