type Set = Int => Boolean
/**
* Indicates whether a set contains a given element.
*/
def contains(s: Set, elem: Int): Boolean = s(elem)
Run Code Online (Sandbox Code Playgroud)
为什么这个contains功能有效?
我不明白.()操作符如何在集合中返回true/ false关于此元素的存在?
逐个采用这种方式,第一行中的类型别名意味着我们可以重写第二行,如下所示:
def contains(s: Int => Boolean, elem: Int): Boolean = s(elem)
Run Code Online (Sandbox Code Playgroud)
但这A => B只是语法糖Function1[A, B],所以我们可以做更多的重写:
def contains(s: Function1[Int, Boolean], elem: Int): Boolean = s(elem)
Run Code Online (Sandbox Code Playgroud)
s(elem)也是语法糖 - 每当你以这种方式"将值"应用于某个值时,Scala就会将它贬低为s.apply(elem):
def contains(s: Function1[Int, Boolean], elem: Int): Boolean = s.apply(elem)
Run Code Online (Sandbox Code Playgroud)
如果你看一下这个apply方法,Function1你就会看到这些类型排成一行.
所以就是这样 - 我们只是将该集合表示为其指标函数,然后将其隐藏在三层语法糖之下.
更新以解决注释:将一个集合表示为其指标函数,可以比通常的基于列表的表示更自然地模拟无限集(以及许多其他集).例如,假设我想要一组所有奇数.使用此处的表示,这很容易:
val odds: Set[Int] = (_ % 2 != 0)
Run Code Online (Sandbox Code Playgroud)
HashSet例如,尝试做同样的事情.
| 归档时间: |
|
| 查看次数: |
986 次 |
| 最近记录: |