Zum Inhalt springen
Anjunar/ DOCS

Accessoren

Ein Accessor ist ein erzeugter Getter und Setter für eine Property. Er ist einfacher Code und funktioniert deshalb auch dort, wo es keine Laufzeit-Reflection gibt.

Im Deskriptor

reflectWithAccessors

reflect lässt Accessoren weg, damit Deskriptoren klein bleiben. reflectWithAccessors legt in jede Property einen, erreichbar über den Namen. Eine var bekommt einen Setter, ein val einen nur lesenden Accessor.

Das Theme über den Accessor umschalten

Die Knöpfe rufen set auf einer Settings-Instanz auf; der Wert wird mit get zurückgelesen.

theme.get(settings)
light
theme.hasSetter
true
version.hasSetter
false
reflect[Settings].getPropertyAccessor("theme")
None
scala
case class Settings(var theme: String, version: Int) val descriptor = ReflectMacros.reflectWithAccessors[Settings] val theme = descriptor.requirePropertyAccessor("theme") val settings = Settings("light", 1) if theme.hasSetter then theme.set(settings, "dark")
Aus einem Selektor

makeAccessor

makeAccessor baut einen einzelnen Accessor aus einem Selektor, ohne Deskriptor drumherum. Den Selektor prüft der Compiler.

theme.get(Settings("light", 1))
light
theme.hasSetter
false
scala
val theme = ReflectMacros.makeAccessor[Settings, String](_.theme) theme.get(settings)
In 1.1.4 nur lesend

In Version 1.1.4 findet makeAccessor keinen Setter, auch nicht bei einer var: Sein Accessor liest, und set wirft UnsupportedOperationException. Nimm den Accessor aus reflectWithAccessors, wenn du schreiben musst.