我是Scala的新手,下面是三个让我困惑的函数声明:
第一
scala> def sum (a: Int, b: Int) = a + b
sum: (a: Int, b: Int)Int
第二
scala> val sum = (a: Int, b: Int) => a + b
sum: (Int, Int) => Int = <function2>
第三
scala> val anotherSum = sum _
anotherSum: () => (Int, Int) => Int = <function0>
我知道第二个是方法,第三个是函数文字。 我的混淆是第一个声明,是普通函数还是其他一些我不理解的语法?我们将不胜感激。
修改
此外,当我尝试使用第一个声明创建部分应用的函数时,我得到了这个:
Function2
我希望类型为sum
public static boolean isTabLayout(Activity activity) {
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;
float scaleFactor = metrics.density;
float widthDp = widthPixels / scaleFactor;
float heightDp = heightPixels / scaleFactor;
float smallestWidth = Math.min(widthDp, heightDp);
if (smallestWidth > 720) {
//Device is a 10" tablet
return true;
} else if (smallestWidth > 600) {
//Device is a 7" tablet
return true;
}
return false;
}
的{{1}}有2个参数。
答案 0 :(得分:3)
第一和第二声明宣布不同的东西。不同语法不一样。
scala> def sum = (a: Int, b: Int) => a + b
sum: (Int, Int) => Int
在这里,您定义一个名为sum
的方法,该方法不接受任何参数,并返回一个带有两个Int
参数并返回Int
的函数。
因此,sum
是方法,会返回一个添加两个数字的函数。
scala> def sum (a: Int, b: Int) = a + b
sum: (a: Int, b: Int)Int
在这里,您定义一个名为sum
的方法,该方法需要两个Int
参数,并返回Int
。
因此,sum
是方法,可以添加两个数字。
不同之处在于,在第一个版本中,sum
不接受任何参数并返回一个函数,而在第二个版本中,sum
接受两个参数并返回Int
。两件截然不同的事情!
第三个:
scala> val sum = (a: Int, b: Int) => a + b
sum: (Int, Int) => Int = <function2>
在此定义一个名为sum
的值,即Function2
,换句话说,这个函数需要两个Int
参数并返回{{ 1}}。
因此,Int
是值,类型为sum
,并且是指添加两个数字的函数。
额外:
Function2
仔细查看类型。 scala> val anotherSum = sum _
anotherSum: () => (Int, Int) => Int = <function0>
是一个函数,它不带任何返回函数的参数,该函数需要两个返回anotherSum
的{{1}}个参数。
你在这里没有部分申请。 Scala语言规范的Section 6.7 Method Values解释了这里发生的事情。