scala dynamics 示例

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

scala dynamics 示例

cloudcoder 2016-05-13 15:12:03 浏览733 评论0

摘要: 简介     scala 新版本 2.10 引入了 Dynamic 这个 trait,意思上就是希望能够动态的 handle 一些东西 示例 package cn.cloud.scala import scala.

简介

    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) 
  }
}
【云栖快讯】阿里云栖开发者沙龙(Java技术专场)火热来袭!快来报名参与吧!  详情请点击

网友评论