Hvad er attr_accessor i Ruby?

Jeg har svært ved at forstå attr_accessor i Ruby. Er der nogen, der kan forklare mig dette?

attr_accessor er nogle gange en metode. (Linket bør give mere indsigt i, hvordan det fungerer - se på de par af metoder, der genereres, og en vejledning bør vise dig, hvordan du bruger det.)

Tricket er, at class er ikke en definition i Ruby (det er "bare en definition" i sprog som C++ og Java), men det er et udtryk der evaluerer. Det er under denne evaluering, at attr_accessor-metoden bliver påkaldt, som igen ændrer den aktuelle klasse - husk den implicitte modtager: self.attr_accessor, hvor self er "open" klasseobjektet på dette tidspunkt.

Behovet for attr_accessor og venner, er, tja:

  1. Ruby, ligesom Smalltalk, tillader ikke, at der er adgang til instansvariabler uden for metoder1 for det pågældende objekt. Det vil sige, at man ikke kan få adgang til instansvariabler i form af x.y, som det er almindeligt i f.eks. Java eller endda Python. I Ruby opfattes y altid som en besked der skal sendes (eller "metode der skal kaldes"). Derfor skaber attr_*-metoderne wrappers, som giver adgang til instansen @variable gennem dynamisk oprettede metoder.

  2. Boilerplate stinker

Håber dette tydeliggør nogle af de små detaljer. God kodning.


1 Dette er ikke helt sandt, og der findes [nogle "teknikker" omkring dette] (https://stackoverflow.com/questions/1074729/get-the-value-of-an-instance-variable-given-its-name), men der er ingen syntaksunderstøttelse for "offentlig instansvariabel" adgang.

Kommentarer (2)

attr_accessor er meget enkel:

attr_accessor :foo

er en genvej for:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

det er ikke andet end en getter/setter for et objekt

Kommentarer (2)

I bund og grund forfalsker de offentligt tilgængelige dataattributter, hvilket Ruby ikke har.

Kommentarer (3)