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:

  1. maintain map[rdd, string] in extendedrddfunctions's companion object use assign member value rdd in setmember. evil option introduce global state , open pitfalls whole range of errors.
  2. create wrapper class contains member value , returned setmember method:

    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 queryforresult on instances not have member. downsides have delegate members of rdd , queryforresult not defined on rdd itself. first issue can addressed macro magic (search "delegate" or "proxy" , "macro"). later issue can resolved defining additional extension method in extendedrddfunctions checks if rdd rddwithmember:

    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

Popular posts from this blog

android - Pass an Serializable object in AIDL -

How to provide Authorization & Authentication using Asp.net, C#? -

How to use Authorization & Authentication in Asp.net, C#? -