Scala - Add member variable to class from outside -
is possible add member variable class outside class? (or mimic behavior?)
here's example of i'm trying do. use implicit conversion add additional functions rdd, added variable extendedrddfunctions. i'm guessing doesn't work because variable lost after conversion in rdd.setmember(string) call.
is there way kind of functionality? wrong approach?
implicit def toextendedrddfunctions(rdd: rdd[map[string, string]]): extendedrddfunctions = { new extendedrddfunctions(rdd) } class extendedrddfunctions(rdd: rdd[map[string, string]]) extends logging serializable { var member: option[string] = none def getmember(): string = { if (member.isdefined) { return member.get } else { return "" } } def setmember(field: string): unit = { member = some(field) } def queryforresult(query: string): string = { // uses member here } } edit: using these functions follows: first call rdd.setmember("state"), rdd.queryforresult(expression).
because implicit conversion applied each time invoke method defined in extendedrddfunctions, there new instance of extendedrddfunctions created every call setmember , queryforresult. instances not share member variables.
you have 2 options:
- maintain
map[rdd, string]inextendedrddfunctions's companion object use assignmembervalue rdd insetmember. evil option introduce global state , open pitfalls whole range of errors. create wrapper class contains
membervalue , returnedsetmembermethod:case class rddwithmember(rdd: rdd[map[string, string]], member: string) extends rdd[map[string, string]] { def queryforresult(query: string): string = { // uses member here } // methods of rdd interface, delegate rdd } implicit class extendedrddfunctions(rdd: rdd[map[string, string]]) { def setmember(field: string): rddwithmember = { rddwithmember(rdd, field) } }beside omitted global state, approach more type safe because cannot call
queryforresulton instances not havemember. downsides have delegate members ofrdd,queryforresultnot defined onrdditself. first issue can addressed macro magic (search "delegate" or "proxy" , "macro"). later issue can resolved defining additional extension method inextendedrddfunctionschecks ifrddrddwithmember:implicit class extendedrddfunctions(rdd: rdd[map[string, string]]) { def setmember(field: string): rddwithmember = // ... def queryforresult(query: string): option[string] = rdd match { case wm: rddwithmember => some(wm.queryforresult(query)) case _ => none } }
Comments
Post a Comment