Scala隐式函数

简介
所谓隐式函数指的是那种以implicit关键字声明的带有单个参数的函数。正如它的名称所表达的,这样的函数将会自动应用,将值从一种类型转换为另一种类型。

隐式函数的使用
需求分析:使用隐式函数解决数据类型的转换问题

object ImplicitDemo01 {
  def main(args: Array[String]): Unit = {

    // 编写一个隐式函数将Double =》 Int
    implicit def douToInt(d: Double): Int = {
      d.toInt
    }
    val num: Int = 3.9
    println(num)
  }
}

这里隐式函数的使用就是将Double类型的3.9隐式的转化为Int类型,在当前的这个作用域中,它会默认的调用 douToInt 这个函数。
注意事项以及细节处理

隐式函数的函数名是可以任意的,隐式函数与函数名称无关。
隐式函数在当前作用域中可以有多个,但是只有一个隐式函数能够被识别。
隐式转换丰富类库功能
1.首先可以定义一个经过丰富的类型,提供你想要的功能

implicit def addDelete(mysql: Mysql): DB = {
    new DB
}

class DB {
  def delete(): Unit = {
    println("delete")
  }
}

2.然后就可以在本身功能的基础上实现上面的功能

class Mysql {
  def insert(): Unit = {
    println("insert")
  }
}

val mysql = new Mysql
mysql.insert()
mysql.delete()  //调用了隐式函数

隐式值,默认值,传值的优先级
当我们在一个程序中同时出现隐式值,默认值,传值的情况时它们是有优先级进行区分的。

// 隐式值
implicit val name: String = "Scala"
// 默认值
def hello(implicit content: String = "jack"): Unit = {
   println("Hello " + content)

hello("wc")    // 传值


隐式值,默认值,传值同时存在的情况下输出:Hello wc

// 隐式值
implicit val name: String = "Scala"
// 默认值
def hello(implicit content: String = "jack"): Unit = {
   println("Hello " + content)

hello

隐式值,默认值同时存在时输出:Hello Scala
小结:

编译器的优先级为 传值 > 隐式值 > 默认值
在隐式值匹配时,不能有二义性
如果 隐式值,默认值,传值 一个都没有,就会报错
隐式类的使用
代码样例

object ImplicitClassDemo {
  def main(args: Array[String]): Unit = {
    // DB1是一个隐式类
    implicit class DB1(val m: Mysql1) {
      def addSuffix(): Unit = {
        println(m + "scala")
      }
    }

    val mysql = new Mysql1
    mysql.sayOk()
    mysql.addSuffix()

  }
}

class DB1{}

class Mysql1{
  def sayOk(): Unit = {
    println("sayOk")
  }
}

注意事项

其所带的构造参数有且只能有一个
隐式类必须被定义在 “类”,“伴生对象”,“包对象”里。
隐式类不能是样例类
作用域内不能有与之相同名称的标识符


原文转自:Scala之隐式函数的使用(八)_不撸代码闲得慌的博客-优快云博客icon-default.png?t=M276https://blog.youkuaiyun.com/qq_44666176/article/details/108310091?ops_request_misc=&request_id=&biz_id=102&utm_term=scalar%E9%9A%90%E5%BC%8F%E5%87%BD%E6%95%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-108310091.142^v2^pc_s

### Scala 转换机制及其应用 在 Scala 中,转换是一种强大的特性,允许编译器自动将一种类型的对象转换为另一种类型。这种功能通过 `implicit` 关键字来实现。 #### 定义转换函数 转换可以通过定义带有 `implicit` 关键字的方法来完成。当遇到无法匹配参数类型的调用时,编译器会尝试查找适用的转换方法并应用它[^1]。 ```scala // 定义一个简单的转换函数 implicit def intToString(x: Int): String = x.toString ``` 上述代码定义了一个从 `Int` 到 `String` 的转换,在需要字符串的地方可以无缝使用整数变量而无需显的 `.toString()` 转换操作。 #### 使用上下文中的值 除了定义转换规则外,还可以利用已导入的作用域内的值来进行更复杂的逻辑处理或提供默认参数设置[^2]。 ```scala object MathUtil { implicit val defaultPrecision: Double = 0.0001 def approxEquals(a: Double, b: Double)(implicit precision: Double): Boolean = math.abs(a - b) <= precision } ``` 在这个例子中,如果未指定精度,则采用预设好的值作为比较的标准误差范围。 #### 应用于库设计模 Lift Web Framework 就很好地运用了这一概念,比如其 CSS 绑定机制就依赖于视图绑定支持动态页面元素更新而不必每次都手动传递模板片段[^3]。 ```scala class MySnippet { def render = "#someElement *" #> "Hello world" } ``` 这里展示了如何借助 CSS 选择器语法简化 HTML 片段替换过程,并且背后依靠的就是框架内部定义的一系列转换规则使得开发者能够写出更加直观简洁的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值