Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 映射容器中函数的紧凑表示法?_Function_Scala_Collections - Fatal编程技术网

Function 映射容器中函数的紧凑表示法?

Function 映射容器中函数的紧凑表示法?,function,scala,collections,Function,Scala,Collections,我正在构建枚举项到对象中简单数据访问器的映射。下面是解释程序使用Int作为键的示例: class Obj(a: Int, b: Int) { def getA = a def getB = b } val m : Map[Int, (Obj) => Int] = Map( (2, (o: Obj) => o.getA) ); val d = m(2)(new Obj(3,4)) 这很好,但在每个映射值的参数中,必须编写一个带有:Obj type的函数,这

我正在构建枚举项到对象中简单数据访问器的映射。下面是解释程序使用Int作为键的示例:

class Obj(a: Int, b: Int) {
    def getA = a
    def getB = b
}

val m : Map[Int, (Obj) => Int] = Map(
    (2, (o: Obj) => o.getA)
);

val d = m(2)(new Obj(3,4))
这很好,但在每个映射值的参数中,必须编写一个带有:Obj type的函数,这似乎是不必要的:

(o: Obj) => o.getA

是否缺少更严格的语法?

在本例中,将推断类型,例如:

scala> val m : Map[Int, (Obj) => Int] = Map(
     |     (2, _.getA)
     | )
m: Map[Int,Obj => Int] = Map(2 -> <function1>)

scala> m(2)( new Obj(3,4) )
res0: Int = 3

在这里,我使用下划线使函数定义尽可能简洁,但也可以将函数定义为:o=>o.getA。如果参数被多次使用,它可能很有用,例如:o=>o.getA+o.getB。

在这种情况下,将推断类型,例如:

scala> val m : Map[Int, (Obj) => Int] = Map(
     |     (2, _.getA)
     | )
m: Map[Int,Obj => Int] = Map(2 -> <function1>)

scala> m(2)( new Obj(3,4) )
res0: Int = 3

在这里,我使用下划线使函数定义尽可能简洁,但也可以将函数定义为:o=>o.getA。如果参数被多次使用,它可能会很有用,例如:o=>o.getA+o.getB。

如果您想去掉左侧的类型注释,这并不总是一个好主意,但有利于简洁,您可以保留原始的右侧,或者稍微短一点:

val m = Map( (2, (_: Obj).getA) )
另外,在Scala中,将类定义为

class Obj(val a: Int, val b: Int)
// or
case class Obj(a: Int, b: Int)

并将字段简单地称为a和b,因为编译器为您提供了getter。

如果您想去掉左侧的类型注释,这并不总是一个好主意,但有利于简洁,您可以保留原始的右侧,或者稍微短一点:

val m = Map( (2, (_: Obj).getA) )
另外,在Scala中,将类定义为

class Obj(val a: Int, val b: Int)
// or
case class Obj(a: Int, b: Int)

由于编译器为您提供了getter,请将字段简单地称为a和b。

谢谢。我将使用这一点并添加注释,以便下一个Java编程也能理解它:谢谢。我将使用它并添加注释,以便接下来的Java编程也能理解它: