同一功能的执行如何定义为_&引用;与Scala中使用命名变量定义的相同
在Scala中,使用“x”定义的同一函数的执行与使用命名变量定义的同一函数的执行有何不同 以下是两个函数定义的输出同一功能的执行如何定义为_&引用;与Scala中使用命名变量定义的相同,scala,Scala,在Scala中,使用“x”定义的同一函数的执行与使用命名变量定义的同一函数的执行有何不同 以下是两个函数定义的输出 scala> import scala.util.Random import scala.util.Random scala> Seq("a", "b", "c").map(x => { val rand = new Random().nextInt; x+":"+rand}).foreach(println) a:1700883193 b:-11537996
scala> import scala.util.Random
import scala.util.Random
scala> Seq("a", "b", "c").map(x => { val rand = new Random().nextInt; x+":"+rand}).foreach(println)
a:1700883193
b:-1153799665
c:-784839760
scala> Seq("a", "b", "c").map({ val rand = new Random().nextInt; _+":"+rand}).foreach(println)
a:-1775524209
b:-1775524209
c:-1775524209
它是否与部分定义的函数有关?我可能遗漏了什么
对这个问题的解释似乎是重复的:我看到类似的问题被问到,但问题的重点并不明确&注意到对不同观点的回答。所以在这里用简单直接的例子提问。另一个问题的链接:
希望它是清楚的。你似乎对这个障碍感到困惑<代码>…映射(x=>{val rand=new Random().nextInt;x+“:“+rand})…可以重写为
val fn = x => { val rand = new Random().nextInt; x+":"+rand })
….map(fn).…
而…map({val rand=new Random().nextInt;+“:“+rand})…
的意思与
….map({ val rand = new Random().nextInt; x => x+":"+rand }).…
可以重写为(注意x=>
的位置)
或(无块)
你似乎对这个街区感到困惑<代码>…映射(x=>{val rand=new Random().nextInt;x+“:“+rand})…可以重写为
val fn = x => { val rand = new Random().nextInt; x+":"+rand })
….map(fn).…
而…map({val rand=new Random().nextInt;+“:“+rand})…
的意思与
….map({ val rand = new Random().nextInt; x => x+":"+rand }).…
可以重写为(注意x=>
的位置)
或(无块)
这不是因为部分函数,而是工作方式。当你写作时:
_ + ":" + rand
编译器interpets:
(x: String) => x.+(":").+(rand)
这是一个函数1[String,String]
。编译器将lambda表达式扩展为具体的AbstractFunction1
,并捕获rand
。以下是生成的类中的相关代码段:
<synthetic> <paramaccessor> private[this] val rand$1: Int = _;
def <init>(rand$1: Int): <$anon: Function1> = {
anonfun$1.this.rand$1 = rand$1;
anonfun$1.super.<init>();
()
其中f$1
是main
方法体,它遍历集合并为序列中的每个元素调用apply
相反,当您为集合中的每个值引入一个新变量时,如下所示:
map(x => { val rand = new Random().nextInt; x+":"+rand})
通过为每次调用apply
绑定到一个新变量,我们看到不再捕获rand
:
@SerialVersionUID(value = 0) final <synthetic> class anonfun$1 extends scala.runtime.AbstractFunction1 with Serializable {
final def apply(x: String): String = {
val rand: Int = new scala.util.Random().nextInt();
x.+(":").+(scala.Int.box(rand))
};
@SerialVersionUID(value=0)最终类anonfun$1使用Serializable扩展了scala.runtime.AbstractFunction1{
最终定义应用(x:字符串):字符串={
val rand:Int=new scala.util.Random().nextInt();
x、 +(“:”).+(scala.Int.box(兰德))
};
这不是因为部分函数,而是工作方式。当您编写时:
_ + ":" + rand
编译器interpets:
(x: String) => x.+(":").+(rand)
这是一个Function1[String,String]
。编译器将lambda表达式扩展为具体的AbstractFunction1
,并捕获rand
。以下是生成的类中的相关片段:
<synthetic> <paramaccessor> private[this] val rand$1: Int = _;
def <init>(rand$1: Int): <$anon: Function1> = {
anonfun$1.this.rand$1 = rand$1;
anonfun$1.super.<init>();
()
其中f$1
是main
方法体,它遍历集合并为序列中的每个元素调用apply
相反,当您为集合中的每个值引入一个新变量时,如下所示:
map(x => { val rand = new Random().nextInt; x+":"+rand})
通过为每次调用apply
绑定到一个新变量,我们看到不再捕获rand
:
@SerialVersionUID(value = 0) final <synthetic> class anonfun$1 extends scala.runtime.AbstractFunction1 with Serializable {
final def apply(x: String): String = {
val rand: Int = new scala.util.Random().nextInt();
x.+(":").+(scala.Int.box(rand))
};
@SerialVersionUID(value=0)最终类anonfun$1使用Serializable扩展了scala.runtime.AbstractFunction1{
最终定义应用(x:字符串):字符串={
val rand:Int=new scala.util.Random().nextInt();
x、 +(“:”).+(scala.Int.box(兰德))
};
它的可能重复项如下所示,但在其他问题上定义的两个代码段略有不同。它的可能重复项如下所示,但在其他问题上定义的两个代码段略有不同。尚不清楚,“本身”将替换输入参数。因此,对于我的代码#2,我没有传递“x”,所以“”将取代它。[换句话说,为什么在代码段行中使用“x”(x=>。+:“+rand)。]谢谢。哎呀,我忘了完全扩展。
。我的意思是在那里使用x
,现在修复了。还不清楚,“,”本身替换输入参数。所以对于我的代码#2,我没有通过“x”,所以“”将取代它。[换句话说,为什么在代码片段行中使用“x”(x=>+”:“+rand)。]谢谢。哎哟,我忘了完全扩展
。我的意思是在那里使用x
,现在修复了。我不熟悉闭包,如果u.计算为闭包,那么Seq(1,2,3)。reduce(+)求值为6?@KiranM_uu不求值为闭包。闭包是指在调用tge函数之前关闭可能超出范围的资源。我建议阅读我在帖子中添加的wiki值。太好了。感谢您的解释。我是闭包新手,如果u求值为闭包,那么Seq(1,2,3)。reduce(+)计算为6?@KiranM_uu不会计算为闭包。闭包是指在调用tge函数之前关闭可能超出范围的资源。我建议阅读我在帖子中添加的wiki值。太好了。感谢您的解释。