Scala:eta扩展函数值(不是方法)
发布时间:2020-12-16 18:10:11 所属栏目:安全 来源:网络整理
导读:在尝试 scala的eta扩展后,我遇到了一个奇怪的功能. 让我们定义一个方法: scala def sum(a: Int,b: Int): Int = a + bsum: (a: Int,b: Int)Int 好的,到现在为止,一切都很好.现在让我们使用eta扩展将其分配给val: scala val f = sum _f: (Int,Int) = Int = $
在尝试
scala的eta扩展后,我遇到了一个奇怪的功能.
让我们定义一个方法: scala> def sum(a: Int,b: Int): Int = a + b sum: (a: Int,b: Int)Int 好的,到现在为止,一切都很好.现在让我们使用eta扩展将其分配给val: scala> val f = sum _ f: (Int,Int) => Int = $$Lambda$1051/694580932@55638165 现在,奇怪的事情即将到来.我可以再次将eta扩展应用于f,并且它正在工作(但它会为我的方法添加currying): scala> val g = f _ g: () => (Int,Int) => Int = $$Lambda$1055/1351568309@5602e540 这为什么有效?我认为eta扩展只适用于方法. scala> ((a: Int,b: Int) => a + b: Int) _ <console>:12: error: _ must follow method; cannot follow (Int,Int) => Int ((a: Int,b: Int) => a + b: Int) _ ^ 但是将eta扩展应用到f是不一样的? 解决方法
当您在REPL的顶层或对象/类中编写val f = sum _时,Scala定义了一个访问器方法,以便您可以访问它.以下是Scala如何解决这个问题(通过scalac -Xprint:typer on val f:(Int,Int)=> Int = _ _):
private[this] val f: (Int,Int) => Int = ((x$1: Int,x$2: Int) => x$1.+(x$2)); <stable> <accessor> def f: (Int,Int) => Int = Foo.this.f; 因此,当您随后编写val g = f _时,它会对零参数访问器方法进行eta扩展,从而导致您看到的行为.有关此问题的更多验证,请注意,如果将定义放在方法中,则会出现错误: def foo = { val f: (Int,Int) => Int = _ + _ val g = f _ // error: _ must follow method; cannot follow (Int,Int) => Int } 这是因为只为字段(和顶级REPL定义生成访问器,这些定义被视为字段). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |