scala – 管理下划线以定义匿名函数的规则是什么?
发布时间:2020-12-16 09:27:13 所属栏目:安全 来源:网络整理
导读:我使用_作为占位符来创建匿名函数,问题是我无法预测Scala将如何转换我的代码.更确切地说,它错误地确定了我想要的“大”匿名函数的大小. List(1,2,3) foreach println(_:Int) //error ! List(1,3) foreach (println(_:Int)) //work List(1,3) foreach(println
我使用_作为占位符来创建匿名函数,问题是我无法预测Scala将如何转换我的代码.更确切地说,它错误地确定了我想要的“大”匿名函数的大小.
List(1,2,3) foreach println(_:Int) //error ! List(1,3) foreach (println(_:Int)) //work List(1,3) foreach(println(_:Int)) //work 使用-Xprint:typer我可以看到Scala将第一个转换为“一个大的匿名函数”: x$1 => List(1,3) foreach(println(x$1:Int)) 工作的第2个3号是正确的转变成我想要的. ... foreach (x$1 => println(x$1:Int)) 为什么这个?规则是什么? 解决方法
确定下划线范围的简单规则:
>如果下划线是方法的参数,那么范围将在该方法之外,否则相应的规则如下; 因此,通过规则#1,而不是println((x:Int)=> x),范围将被放置在println之外(包括). 根据规则#2,后两个示例将具有由括号分隔的函数,因此(x => println(x:Int)). 根据规则#3,第一个例子将是整个表达式,因为没有分隔括号. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |