scala dynamics 示例

  1. 云栖社区>
  2. 博客>
  3. 正文

scala dynamics 示例

cloudcoder 2016-05-13 15:12:03 浏览1100
展开阅读全文

简介

    scala 新版本 2.10 引入了 Dynamic 这个 trait,意思上就是希望能够动态的 handle 一些东西

示例

package cn.cloud.scala
import scala.language.dynamics
import scala.collection.mutable.HashMap

class DynamicPerson extends Dynamic {
  //定义一个方法类型 CallFun,它接收 Int 类型参数,并返回 String 类型 ,这个有点像 C# 中的 delegate 
  type CallFun = Int => String
  
  //Map对象,存放属性
  private val fields = HashMap.empty[String, Any].withDefault {
    key => throw new NoSuchFieldError(key)
  }
  
  //Map对象,存放方法对象
  private val functions = HashMap.empty[String, CallFun].withDefault {
    key => throw new NoSuchFieldError(key)
  }
  //选取对象
  def selectDynamic(key: String) = fields(key)
  /**
   * 更新key对应的value
   * 这里做了一个判断,如果key以do字符串开头,我们认为是args是CallFun类型
   */
  def updateDynamic(key: String)(args: Any): Unit = {
    args match {
      case x if key.startsWith("do") => functions(key) = x.asInstanceOf[CallFun]
      case _ => fields(key) = args
    }
  }
  //这个就是用来动态执行方法的
  def applyDynamic(key: String)(arg: Int) = {
    println(functions(key)(arg))
  }
}

object SimpleDemo {
  def main(args: Array[String]): Unit = {
    val person = new DynamicPerson()
    //设置Name属性
    person.Name = "Mike"
    //定义一个 call 方法
    person.doPrintInfo = (age: Int) => s"${person.Name} 今年 $age 岁"
    //通过 applyDynamic 执行 call 方法 
    person.doPrintInfo(80) 
  }
}

网友评论

登录后评论
0/500
评论
cloudcoder
+ 关注