scala中 隐式转换

一、

隐式转换: 编译器 偷偷地,自动地帮我们把一种数据类型转换为另一种类型

例如: int --> double

Scala 复制代码
object test {
    // 复习隐式转换
    // 隐式转换: 编译器 偷偷地,自动地帮我们把一种数据类型转换为另一种类型
    //         例如: int --> double
    // 它有失败的时候 (double ---> int), 有成功的时候
    // 当它转换失败的时候,我们提供一个工具,让它能成功

    // 明确地,把double转成int
    implicit def X(d:Double): Int = {
        d.toInt
    }

    def main(args: Array[String]): Unit = {
        var i:Int = 1
        var j:Double - 2.1

        i = j // 把double 转入 Int
        // j = 1 // 把Int 转入 Double
        println(i)
    }
}

二、

Scala 复制代码
object test1 {
    // 开始你的代码1
    class StrongString(val str:String) {
        def isPhone(): Boolean = {
            val reg = "1[3-9]\\d{9}".r
            reg.matches(str)
        }
    }
    // 定义一个特殊的转换函数,把str ===> StrongString的对象
    def tranform(str:String):StrongString = {
        new StrongString(str)
    }


    def main(args: Array[String]): Unit = {
        val str = "13612345678"
//        println(isPhone(str))
//        println(isPhone("abc"))
//        println( (new StrongString(str)).isPhone() )
        println( tranform("abc").isPhone() )
        println(str.isPhone())  //  ==> true
        println("136a".isPhone())  // ==> false
    }
}

以下是使用隐式函数更正后的 Scala 代码,主要思路是通过定义隐式转换函数,让普通的String类型能够自动转换为StrongString类型,这样就可以直接在String上调用isPhone方法了,代码如下:

Scala 复制代码
object test1 {
    // 定义StrongString类,用于封装字符串并提供判断是否为手机号的方法
    class StrongString(val str: String) {
        def isPhone(): Boolean = {
            val reg = "1[3-9]\\d{9}".r
            reg.matches(str)
        }
    }

    // 定义隐式转换函数,将String类型隐式转换为StrongString类型
    implicit def stringToStrongString(str: String): StrongString = {
        new StrongString(str)
    }

    def main(args: Array[String]): Unit = {
        val str = "13612345678"
        // 这里可以直接在String类型的变量上调用isPhone方法,得益于隐式转换
        println(str.isPhone())
        println("136a".isPhone())
    }
}

三、校验自己的手机号

Scala 复制代码
package test38
// 需求1:
// 完成一个功能,让所有的字符串都能调用isPhone方法,来校验自己是不是一个手机号
object test1 {
    // 开始你的代码
    class StrongString(val str: String) {
        def isPhone(): Boolean = {
            val reg = "1[3-9]\\d{9}".r
            reg.matches(str)
        }
        // 验证是否身份证号
        def isID:Boolean = {
            val reg = "".r
            reg.matches(str)
        }
    }
    // 定义一个特殊的转换函数1,把str ===> StrongString的对象
    implicit def xxxx(str: String): StrongString = {
    // println("偷偷调用implicit")
        new StrongString(str)
    }
    def main(args: Array[String]): Unit = {
        println("1136a".isPhone()) // ==> false
    }
}
相关推荐
我是唐青枫26 分钟前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
开发语言·c#·.net
程序猿编码35 分钟前
纯C++轻量计算机视觉推理引擎:基于GGML的端侧CV模型部署技术全解析
开发语言·c++·计算机视觉·大模型·transformer
SEO_juper1 小时前
外贸多语言站最隐蔽的流量杀手:hreflang 错了,谷歌把德语页推给美国人(附审计脚本)
开发语言·前端·python·seo·独立站·谷歌优化
geovindu1 小时前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
Tairitsu_H2 小时前
[C++] C++11新增构造:列表初始化和std::initializer_list
开发语言·c++·c++11·构造
宣宣猪的小花园.2 小时前
【嵌入式】故障与降级:看门狗、保护机制和工程可靠性的底线
开发语言·人工智能·嵌入式硬件·机器学习
shmily麻瓜小菜鸡2 小时前
JS/TS 易踩坑知识点 — 自动分号插入(ASI)
开发语言·javascript·ecmascript
CoderYanger2 小时前
前端基础——JavaScript(WebAPI)代码案例
java·开发语言·前端·javascript·css·前端框架·html5
geovindu2 小时前
CSharp: Task Scheduler
开发语言·后端·c#·.net·.netcore
qq_401700412 小时前
Qt窗体大小控制从resize到自适应
开发语言·qt