scala - Referencing instance member from anonymous function -
i'm trying define class instances have string , function. in function string parameter used.
class tenant(val name: string, exclusion: map[string, int] => boolean) val rule1 = new tenant(name = "baker3", (suggestedfloor: map[string, int]) => suggestedfloor(name) != topfloor) val rule1 = new tenant(name = "cooper2", (suggestedfloor: map[string, int]) => suggestedfloor(name) != groundfloor) which gives error on last use of name: not found: value name.
how can that?
problem:
you trying reference name name in lexical context it's not available:
val rule1 = new tenant(name = "cooper2", (suggestedfloor: map[string, int]) => suggestedfloor(name) != groundfloor) — name in context not refer name defined within tenant, instead name name in scope of rule1 definition, of course not exist. code, error disappear of course not want:
val name = ??? // `name` gets referenced lambda val rule1 = new tenant(name = "cooper2", (suggestedfloor: map[string, int]) => suggestedfloor(name) != groundfloor) solution:
to work around that, instead of passing in function @ time of instantiation, use method override instead:
abstract class tenant(val name: string) { def exclusion(suggestedfloor: map[string, int]): boolean } val rule1 = new tenant(name = "baker3") { def exclusion(suggestedfloor: map[string, int]) = suggestedfloor(name) != topfloor } this creates anonymous subclass of tenant "custom" definition exclusion; this, say, considered idiomatic style in scala.
alternatively, can resort different semantics , override not method attribute contains function instead; yield shorter syntax when combined more compact form of lambda definition using _:
abstract class tenant(val name: string) { val exclusion: map[string, int] => boolean } val rule1 = new tenant(name = "baker3") { val exclusion = (_: map[string, int])(name) != topfloor } unfortunately, need map[string, int] re-declaration, not eliminated type inferencer, reasons people smarter me can elaborate on.
Comments
Post a Comment