Essential Scala: Literals

作者: 刘光聪 | 来源:发表于2016-07-05 19:26 被阅读249次

    Scala对象系统

    Scala对象系统

    总体上,Scala对象系统可分为两类:

    • 引用类型
    • 值类型

    引用类型

    • AnyRef的子类
    • 使用new构造对象
    • 当存在默认构造函数,可以略去括号
    • AnyRef等价于java.lang.Object
    • 可以将null赋值给Reference Type

    值类型

    • AnyVal的子类
    • Char, Byte, Short, Int, Long, Float, Double, Unit, Boolean
    • 不能使用new构造实例,而使用Literal Values构造实例
    • 编译器将其映射为Java原生类型,以便提升性能
    • 不能将null赋值给Int的变量

    Int为例,Int的定义应该类似于:

    final abstract class Int private extends AnyVal
    
    • final表示不能被子类化
    • abstract表示不能被实例化
    • private表示主构造函数私有化,进一步保证不能被实例化
    • extends AnyVal表示只能使用字面值构造实例

    数值

    归功于Scala良好的可扩展性,数值文字可以表现得像普通对象一样。

    1 to 10    
    

    事实上,Int并不存在to方法,Predef定义了一个IntRichInt的隐式转换,从而提供更丰富的操作数值的方法。

    object Predef {
      implicit def intWrapper(x: Int) = new runtime.RichInt(x)
    }
    
    package scala.runtime
    
    class RichInt(val self: Int) extends AnyVal {
      ......
      def to(end: Int): Range.Inclusive = Range.inclusive(self, end)
    }
    

    字符串

    "+9519760513".exists(_.isDigit)
    

    java.lang.String并不存在exists方法,Predef定义了一个隐式转换,使String可以隐式地转换为StringOps,从而提供更丰富的操作字符串的方法。

    object Predef {
      implicit def augmentString(x: String): StringOps = new StringOps(x)
    }
    

    Unit

    Unit类型在JVM中对应于Javavoid

    final abstract class Unit private extends AnyVal
    

    ()是其唯一的实例。

    classOf[Unit] // Class[Unit] = void
    ().getClass // Class[Unit] = void
    
    classTag[Unit] // scala.reflect.ClassTag[Unit] = Unit
    classTag[Unit].runtimeClass // Class[_] = void
    

    Null

    Null是所有AnyRef的子类型,存在唯一的实例null。不能将null赋予Value Types

    val num: Int = null  // Error
    

    符号

    '1th
    '2th
    

    如果符号中有空格,可以是使用Symbol::apply直接构造

    Symbol("Programming Scala")
    

    元组

    (1, "two")等价于Tuple2(1, "twp"),或者Tuple2[Int, String](1, "two")

    val t1 = (1, "two")
    val t1: (Int,String) = (1, "two")
    val t2: Tuple2[Int,String] = (1, "two")
    

    函数值

    (i: Int, s: String) => s+i是类型为Function2[Int, String, String]的一个字面值。

    字面值的类型定义常常用于类型声明:

    val f1: (Int, String) => String = (i, s) => s + i
    val f2 = (i: Int, s: String) => s + i
    val f3: Function2[Int, String, String] = (i, s) => s+ i
    

    自定义

    归功于Scala良好的可扩展性,Scala可方便地实现文字的自定义。

    Map元组
    val capital = Map("US" -> "Washington", "France" -> "Paris")
    

    "US" -> "Washington"构造了一个类型为Tuple2[String, String]的二元组:("US", "Washington")

    package scala
    
    object Predef {
      implicit final class ArrowAssoc[A](self: A) extends AnyVal {
        def ->[B](y: B) = (self, y)
      }
    }
    
    正则表达式
    val regex = "([0-9]+) ([a-z]+)".r
    
    字符串内插
    println(s"$name is $age years old.")
    

    s其本质仅仅是一个函数而已。

    package scala
    
    case class StringContext {
       def s(args: Any*): String = ??? 
    }
    

    相关文章

      网友评论

        本文标题:Essential Scala: Literals

        本文链接:https://www.haomeiwen.com/subject/wpohjttx.html