小鹏闲话
小鹏闲话

不自由,仍可活


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 心路之旅

  • Scala 之旅

  • 搜索

Scala之旅——注解

发表于 2018-10-23 分类于 翻译
本文字数: 2.4k 阅读时长 ≈ 2 分钟
原文:https://docs.scala-lang.org/tour/annotations.html

注解将元信息和定义关联起来。例如,注解方法前的@deprecated会使得编译器在该方法被调用时打印一条警告。

1
2
3
4
5
6
object DeprecationDemo extends App {
@deprecated("deprecation message", "release # which deprecates method")
def hello = "hola"

hello
}

上述代码可以通过编译但是编译器会打印一条警告:“there was one deprecation warning”。

注解子句用于其后的第一个定义或者声明。一个定义或者声明的前面可以出现不止一个注解子句,而它们的顺序并不重要。

阅读全文 »

Scala之旅——隐式转换

发表于 2018-09-21 分类于 翻译
本文字数: 1.1k 阅读时长 ≈ 1 分钟
原文:https://docs.scala-lang.org/tour/implicit-conversions.html

从类型S到类型T的隐式转换,由一个拥有函数类型S => T的隐式值,或者一个可转换为指定类型的隐式方法所定义。

隐式转换适用于以下2中场景:

  • 如果一个表达式e是S类型的,且S类型不能转换成表达式所期望的T类型。
  • 在一个S类型的e的选择器e.m中,如果m不是S的成员。

第一种场景中,会去查找一个适用于e且其返回类型可以转换为T的转换c。

第二种场景中,则会去查找一个适用于e且其返回结果包含了一个名为m的成员的转换c。

如果隐式方法List[A] => Ordered[List[A]]和Int => Ordered[Int]都在作用域内,那么对于下面两个List[Int]类型的列表的操作是合法的:

阅读全文 »

Scala之旅——自身类型

发表于 2018-09-13 分类于 翻译
本文字数: 872 阅读时长 ≈ 1 分钟
原文:https://docs.scala-lang.org/tour/self-types.html

自身类型是声明一个特质必须混入另外一种特质的方法,即使它并不继承。这使得不需要引入就可以使用依赖的成员。

自身类型可以缩短this类型或者其他别名为this的标识符。这种语法看起来像是普通的函数语法,但意思是完全不同的。

为了在特质中使用自身类型,需要写一个混入的其他特质的类型的标识符,以及一个=>(例如someIdentifier: SomeOtherTrait =>)。

阅读全文 »

Scala之旅——隐式参数

发表于 2018-09-12 分类于 翻译
本文字数: 1.7k 阅读时长 ≈ 2 分钟
原文:https://docs.scala-lang.org/tour/implicit-parameters.html

一个方法可以拥有隐式参数列表,它由_implicit_关键字在参数列表的开头作为标记。如果这个参数列表的参数没有正常传递的话,Scala会去查找一个正确类型的隐式值,如果找到了,则会自动传递。

Scala查找找些参数的位置分以下2种类型:

  • 在带有隐式参数块的方法被调用时,Scala首先会查找可以直接访问(不需要加前缀)的隐式定义和隐式参数。
  • 然后会查找与隐式候选类型相关联的所有伴生对象中标记为implicit的成员。

关于Scala查找隐式值的位置,在the FAQ有更加详细的讲解。

阅读全文 »

Scala之旅——复合类型

发表于 2018-09-11 分类于 翻译
本文字数: 816 阅读时长 ≈ 1 分钟
原文:https://docs.scala-lang.org/tour/compound-types.html

有时候需要表达一个对象的类型是多个其他类型的子类型,在Scala中使用复合类型可以做到,这时它是多个类型的交集。

假设已有2个特质Cloneable和Resetable:

1
2
3
4
5
6
7
8
trait Cloneable extends java.lang.Cloneable {
override def clone(): Cloneable = {
super.clone().asInstanceOf[Cloneable]
}
}
trait Resetable {
def reset: Unit
}

现在如果我们需要写一个函数cloneAndReset,它接受一个对象,克隆并且重置它:

阅读全文 »

Scala之旅——抽象类型

发表于 2018-09-10 分类于 翻译
本文字数: 1.4k 阅读时长 ≈ 1 分钟
原文:https://docs.scala-lang.org/tour/abstract-types.html

特质和抽象类可以拥有抽象类型的成员。这意味着具体的实现可以定义实际的类型,下面是示例:

1
2
3
4
trait Buffer {
type T
val element: T
}

这里我们定义了一个抽象的type T,用来描述element的类型。我们可以在抽象类中继承该特质,并为T增加了一个类型上界使之更为具体。

阅读全文 »

Scala之旅——内部类

发表于 2018-09-08 分类于 翻译
本文字数: 1.9k 阅读时长 ≈ 2 分钟
原文:https://docs.scala-lang.org/tour/inner-classes.html

在Scala中,可以在类中拥有别的类作为其成员。与Java语言中内部类是包含它的类的成员相反,Scala中这些内部类是绑定在它的外部对象上的。如果想要在混合属于不同图的节点的时候,编译器能够在编译时阻止我们,那么路径依赖类型(Path-dependent types)提供了一种方案。

阅读全文 »

Scala之旅——型变

发表于 2018-09-07 分类于 翻译
本文字数: 3.8k 阅读时长 ≈ 3 分钟
原文:docs.scala-lang.org/tour/variances.html

型变是复杂类型的子类型关系与它们组件的类型的子类型关系之间的关联性。Scala支持 泛型类的类型参数上的型变注解,可以使得它们是协变的、逆变的或者不变的(如果没有使用注解的话)。型变在类型系统中的使用使得我们在复杂的类型之间建立起了直观的联系,反之如果没有型变则限制了抽象类的重用。

阅读全文 »

Scala之旅——类型下界

发表于 2018-09-06 分类于 翻译
本文字数: 1.4k 阅读时长 ≈ 1 分钟
原文:https://docs.scala-lang.org/tour/lower-type-bounds.html

类型上界限制了一个类型是另外一个类型的子类型,而类型下界则声明了一个类型是另外一个类型的父类型。B >: A表明了类型参数B或者抽象类型B是类型A的超类。在大多数场景中,A是作为类的类型参数,而B会作为方法的类型参数。

这里有个十分有用的例子:

阅读全文 »

Scala之旅——类型上界

发表于 2018-09-05 分类于 翻译
本文字数: 981 阅读时长 ≈ 1 分钟
原文:https://docs.scala-lang.org/tour/upper-type-bounds.html

在Scala中,类型参数和抽象类型可能受到类型边界的约束。这些类型边界限制了具体的类型变量,同时揭示了关于该类型成员更多的信息。一个类型上界T <: A表明了类型变量T是类型A的子类型。

这里有个例子演示了类PetContainer的类型参数的类型上界:

阅读全文 »

123…24
小鹏

小鹏

238 日志
7 分类
111 标签
RSS
GitHub 知乎
Creative Commons
推荐阅读
  • 心路之旅
  • Scala 之旅
© 2014 – 2019 小鹏 | 站点总字数: 336k | 站点阅读时长 ≈ 5:06
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Muse v7.2.0
|
0%