Scala教程之:可扩展的scala
  TEZNKK3IfmPf 2023年11月14日 26 0

Scala是扩展的,Scala提供了一种独特的语言机制来实现这种功能:

  • 隐式类: 允许给已有的类型添加扩展方法
  • 字符串插值: 可以让用户使用自定义的插值器进行扩展

隐式类

隐式类是在scala 2.10中引入的,隐式类指的是用implicit关键字修饰的类。在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换。

下面举个例子:

object Helpers {
implicit class IntWithTimes(x: Int) {
def times[A](f: => A): Unit = {
def loop(current: Int): Unit =
if(current > 0) {
f
loop(current - 1)
}
loop(x)
}
}
}

 

这里我们定义了一个隐式类IntWithTimes, 它有一个接收Int类型的构造函数,和一个times方法。那么当我们将这个类引入到我们自己的作用域时,Int类型就拥有了新的times方法:

scala> import Helpers._
import Helpers._

scala> 5 times println("HI")
HI
HI
HI
HI
HI

 

限制条件

隐式类有以下限制条件:

  1. 只能在别的trait/类/对象内部定义。
object Helpers {
implicit class RichInt(x: Int) // 正确!
}
implicit class RichDouble(x: Double) // 错误!

 

  1. 构造函数只能携带一个非隐式参数
implicit class RichDate(date: java.util.Date) // 正确!
implicit class Indexer[T](collecton: Seq[T], index: Int) // 错误!
implicit class Indexer[T](collecton: Seq[T])(implicit index: Index) // 正确!

 

  1. 在同一作用域内,不能有任何方法、成员或对象与隐式类同名,注意:这意味着隐式类不能是case class。
object Bar
implicit class Bar(x: Int) // 错误!

val x = 5
implicit class x(y: Int) // 错误!

implicit case class Baz(x: Int) // 错误!

 

字符串插值

所谓字符串插值就是将变量引用直接插入处理过的字面字符中。 这是在scala2.10.0版本引入的。

val name="James"
println(s"Hello,$name")//Hello,James

 

在上例中, s”Hello,$name” 是待处理字符串字面,编译器会对它做额外的工作。待处理字符串字面通过“号前的字符来标示(例如:上例中是s)。

Scala 提供了三种创新的字符串插值方法:s,f 和 raw.

s 字符串插值器

在任何字符串前加上s,就可以直接在串中使用变量了。你已经见过这个例子:

val name="James"
println(s"Hello,$name")//Hello,James

 

此例中,$name嵌套在一个将被s字符串插值器处理的字符串中。插值器知道在这个字符串的这个地方应该插入这个name变量的值,以使输出字符串为Hello,James。使用s插值器,在这个字符串中可以使用任何在处理范围内的名字。

字符串插值器也可以处理任意的表达式。例如:

println(s"1+1=") 将会输出字符串1+1=2。任何表达式都可以嵌入到
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年04月26日   48   0   0 面向对象Scala
  TEZNKK3IfmPf   2023年11月14日   25   0   0 Scala
  TEZNKK3IfmPf   2024年04月26日   31   0   0 htmlScala
  TEZNKK3IfmPf   2023年11月14日   19   0   0 Scala
  TEZNKK3IfmPf   2023年11月14日   15   0   0 参数Scala
  TEZNKK3IfmPf   2024年04月26日   36   0   0 Scalajavascript
  TEZNKK3IfmPf   2023年11月14日   16   0   0 Scala
  TEZNKK3IfmPf   2023年11月15日   16   0   0 Scalapython
  TEZNKK3IfmPf   2024年04月26日   45   0   0 Scala
  TEZNKK3IfmPf   2023年11月14日   21   0   0 Scala
  TEZNKK3IfmPf   2023年11月14日   19   0   0 Scala
  TEZNKK3IfmPf   2023年11月14日   77   0   0 Scala类型
  TEZNKK3IfmPf   2023年11月14日   26   0   0 Scala
TEZNKK3IfmPf