做美图网站有哪些东西新开传奇网站大全
news/
2025/10/8 19:26:52/
文章来源:
做美图网站有哪些东西,新开传奇网站大全,淄博网站开发找网泰,如何渗透wordpress的网站原文链接#xff1a;http://www.cnblogs.com/MOBIN/p/5351900.html----------------------------------------------摘要#xff1a;通过隐式转换#xff0c;程序员可以在编写Scala程序时故意漏掉一些信息#xff0c;让编译器去尝试在编译期间自动推导出这些信息来#xf… 原文链接http://www.cnblogs.com/MOBIN/p/5351900.html----------------------------------------------摘要通过隐式转换程序员可以在编写Scala程序时故意漏掉一些信息让编译器去尝试在编译期间自动推导出这些信息来这种特性可以极大的减少代码量忽略那些冗长过于细节的代码。使用方式1.将方法或变量标记为implicit2.将方法的参数列表标记为implicit3.将类标记为implicitScala支持两种形式的隐式转换隐式值用于给方法提供参数隐式视图用于类型间转换或使针对某类型的方法能调用成功隐式值例1声明person方法。其参数为name类型Stringscala def person(implicit name : String) name //name为隐式参数
person: (implicit name: String)String 直接调用person方法 scala person
console:9: error: could not find implicit value for parameter name: Stringperson^ 报错编译器说无法为参数name找到一个隐式值 定义一个隐式值后再调用person方法scala implicit val p mobin //p被称为隐式值
p: String mobin
scala person
res1: String mobin 因为将p变量标记为implicit所以编译器会在方法省略隐式参数的情况下去搜索作用域内的隐式值作为缺少参数。 但是如果此时你又在REPL中定义一个隐式变量再次调用方法时就会报错scala implicit val p1 mobin1
p1: String mobin1
scala person
console:11: error: ambiguous implicit values:both value p of type Stringand value p1 of type Stringmatch expected type Stringperson^ 匹配失败所以隐式转换必须满足无歧义规则在声明隐式参数的类型是最好使用特别的或自定义的数据类型不要使用Int,String这些常用类型避免碰巧匹配 隐式视图隐式转换为目标类型把一种类型自动转换到另一种类型 例2将整数转换成字符串类型scala def foo(msg : String) println(msg)
foo: (msg: String)Unitscala foo(10)
console:11: error: type mismatch;
found : Int(10)
required: String
foo(10)
^ 显然不能转换成功解决办法就是定义一个转换函数给编译器将int自动转换成String scala implicit def intToString(x : Int) x.toString
intToString: (x: Int)Stringscala foo(10)
10 隐式转换调用类中本不存在的方法 例3通过隐式转换使对象能调用类中本不存在的方法 class SwingType{def wantLearned(sw : String) println(兔子已经学会了sw)
}
object swimming{implicit def learningType(s : AminalType) new SwingType
}
class AminalType
object AminalType extends App{import com.mobin.scala.Scalaimplicit.swimming._val rabbit new AminalTyperabbit.wantLearned(breaststroke) //蛙泳
} 编译器在rabbit对象调用时发现对象上并没有wantLearning方法此时编译器就会在作用域范围内查找能使其编译通过的隐式视图找到learningType方法后编译器通过隐式转换将对象转换成具有这个方法的对象之后调用wantLearning方法 可以将隐式转换函数定义在伴生对象中在使用时导入隐式视图到作用域中即可如例4的learningType函数 还可以将隐式转换函数定义在凶对象中同样在使用时导入作用域即可如例4 例4 class SwingType{def wantLearned(sw : String) println(兔子已经学会了sw)
}package swimmingPage{
object swimming{implicit def learningType(s : AminalType) new SwingType //将转换函数定义在包中}
}
class AminalType
object AminalType extends App{import com.mobin.scala.Scalaimplicit.swimmingPage.swimming._ //使用时显示的导入val rabbit new AminalTyperabbit.wantLearned(breaststroke) //蛙泳
} 像intToStringlearningType这类的方法就是隐式视图通常为Int String的视图定义的格式如下 implicit def originalToTarget (argument : OriginalType) : TargetType 其通常用在于以两种场合中 1.如果表达式不符合编译器要求的类型编译器就会在作用域范围内查找能够使之符合要求的隐式视图。如例2当要传一个整数类型给要求是字符串类型参数的方法时在作用域里就必须存在Int String的隐式视图2.给定一个选择e.t如果e的类型里并没有成员t则编译器会查找能应用到e类型并且返回类型包含成员t的隐式视图。如例3隐式类在scala2.10后提供了隐式类可以使用implicit声明类但是需要注意以下几点1.其所带的构造参数有且只能有一个 2.隐式类必须被定义在类伴生对象和包对象里 3.隐式类不能是case classcase class在定义会自动生成伴生对象与2矛盾 4.作用域内不能有与之相同名称的标示符 例5object Stringutils {implicit class StringImprovement(val s : String){ //隐式类def increment s.map(x (x 1).toChar)}
}
object Main extends App{import com.mobin.scala.implicitPackage.Stringutils._println(mobin.increment)
} 编译器在mobin对象调用increment时发现对象上并没有increment方法此时编译器就会在作用域范围内搜索隐式实体发现有符合的隐式类可以用来转换成带有increment方法的StringImprovement类最终调用increment方法。 隐式转换的时机 1.当方法中的参数的类型与目标类型不一致时 2.当对象调用类中不存在的方法或成员时编译器会自动将对象进行隐式转换隐式解析机制 即编译器是如何查找到缺失信息的解析具有以下两种规则 1.首先会在当前代码作用域下查找隐式实体隐式方法 隐式类 隐式对象 2.如果第一条规则查找隐式实体失败会继续在隐式参数的类型的作用域里查找 类型的作用域是指与该类型相关联的全部伴生模块一个隐式实体的类型T它的查找范围如下 1如果T被定义为T with A with B with C,那么A,B,C都是T的部分在T的隐式解析过程中它们的伴生对象都会被搜索 2如果T是参数化类型那么类型参数和与类型参数相关联的部分都算作T的部分比如List[String]的隐式搜索会搜索List的 伴生对象和String的伴生对象 3 如果T是一个单例类型p.T即T是属于某个p对象内那么这个p对象也会被搜索 4 如果T是个类型注入S#T那么S和T都会被搜索 隐式转换的前提1.不存在二义性如例12.隐式操作不能嵌套使用如 convert1(covert2(x))y3.代码能够在不使用隐式转换的前提下能编译通过就不会进行隐式黑铁
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/931865.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!