官术网_书友最值得收藏!

Local functions

Here is an example of two functions that are local to the enclosing method:

def average(in: Int*): Int = {
def sum(in: Int*): Int = in.sum
def count(in: Int*): Int = in.size
sum(in:_*)/count(in:_*)
}

In this example, we have both sum and count defined inside of the average definition, which makes them inaccessible from the outside:

scala> :type sum
^
error: not found: value sum

scala> :type count
^
error: not found: value count

As already mentioned, the function does not need to be nested in another method. The enclosing block can be of any kind, for example, a variable definition. For instance, consider if the average function from the previous example was only defined in order to calculate a single average:

val items = Seq(1,2,3,4,5)
val avg = average(items:_*)

We could rewrite both code blocks as follows:

val items = Seq(1,2,3,4,5)
val avg = {
def sum(in: Int*): Int = in.sum
def count(in: Int*): Int = in.size
sum(items:_*)/count(items:_*)
}

The scope visibility rules apply for methods the same way as for other language constructs. Because of this, the parameters of the outer method are visible to the inner functions and don't need to be passed explicitly. We can rewrite our first example again using this rule, as follows:

def averageNoPassing(in: Int*): Int = {
def sum: Int = in.sum
def count: Int = in.size
sum /count
}

There is a special name for the functions that refer to the definitions from the enclosing block, closures. Let's discuss them a little more deeply.

主站蜘蛛池模板: 克什克腾旗| 泸西县| 温州市| 石景山区| 内乡县| 陆丰市| 正宁县| 汾西县| 宜丰县| 武清区| 彰武县| 彰武县| 瑞安市| 扬州市| 和田市| 乡宁县| 应用必备| 介休市| 阳原县| 卢龙县| 两当县| 南召县| 普陀区| 石景山区| 岳西县| 康保县| 托克逊县| 焉耆| 二连浩特市| 大悟县| 台东市| 台山市| 台安县| 万宁市| 铁岭县| 竹山县| 察隅县| 五大连池市| 金堂县| 连南| 酒泉市|