Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Scala 命名参数中的下划线_Scala_Scala Placeholder Syntax - Fatal编程技术网

Scala 命名参数中的下划线

Scala 命名参数中的下划线,scala,scala-placeholder-syntax,Scala,Scala Placeholder Syntax,有人能解释一下这里到底发生了什么事吗?我现在还没有完全了解它: val s = Seq(1D,2D,3D,4D) case class WithUnit(value: Double, unit: String) s map { WithUnit(_,"cm") } // works s map { WithUnit(value = _ , unit = "cm") } // error: missing parameter type for expanded function ((x$2) =&

有人能解释一下这里到底发生了什么事吗?我现在还没有完全了解它:

val s = Seq(1D,2D,3D,4D)
case class WithUnit(value: Double, unit: String)
s map { WithUnit(_,"cm") } // works
s map { WithUnit(value = _ , unit = "cm") } // error: missing parameter type for expanded function ((x$2) => value = x$2)
我猜编译器无法推断参数类型,因为我写了参数的名称。但为什么不呢?不应该仅仅因为陈述论点的名称而变得更困难

谢谢

试试这个:

scala> val withUnits = s map { x => WithUnit(value = x, unit = "cm") }
withUnits: Seq[WithUnit] = List(WithUnit(1.0,cm), WithUnit(2.0,cm), WithUnit(3.0,cm), WithUnit(4.0,cm))
问题在于使用下划线直接定义任意名称函数

详细说明见。

请尝试以下操作:

scala> val withUnits = s map { x => WithUnit(value = x, unit = "cm") }
withUnits: Seq[WithUnit] = List(WithUnit(1.0,cm), WithUnit(2.0,cm), WithUnit(3.0,cm), WithUnit(4.0,cm))
问题在于使用下划线直接定义任意名称函数

详细说明见。

当您编写:

 WithUnit(value = _, unit = "cm")
你想让它意味着:

 x => WithUnit(value = x, unit = "cm")
但是如果仔细查看错误消息,您会发现编译器没有这样看,它将其解析为:

 WithUnit(x => value = x, unit = "cm"})
正如您所看到的,u的作用域比您想要的更紧密

_始终尽可能选择最紧密的非退化范围。在解析过程中,范围完全是通过语法确定的,不考虑类型

所谓非退化,我的意思是编译器并不认为你的意思是:

WithUnit(value = x => x, unit = "cm")
最紧密的非退化范围是指由最里面的函数括号相对于下划线定义的范围。如果没有这样的规则,当函数调用嵌套时,编译器将无法知道哪个函数对应于哪个函数。

当您编写:

 WithUnit(value = _, unit = "cm")
你想让它意味着:

 x => WithUnit(value = x, unit = "cm")
但是如果仔细查看错误消息,您会发现编译器没有这样看,它将其解析为:

 WithUnit(x => value = x, unit = "cm"})
正如您所看到的,u的作用域比您想要的更紧密

_始终尽可能选择最紧密的非退化范围。在解析过程中,范围完全是通过语法确定的,不考虑类型

所谓非退化,我的意思是编译器并不认为你的意思是:

WithUnit(value = x => x, unit = "cm")

最紧密的非退化范围是指由最里面的函数括号相对于下划线定义的范围。如果没有这样的规则,当函数调用嵌套时,编译器将无法知道哪个函数对应于哪个函数。

感谢您提供的链接,有时会忘记检查圣经;)谢谢你的链接,有时候你会忘记查圣经;)啊,我明白了!现在我有了更深的理解。。。。最紧的非退化范围。。。我会记住的!非常感谢。但可以说,这是一个bug<代码>WithUnit(,“cm”)之所以有效,是因为它被视为部分应用的函数,而不是匿名函数文本。当与命名参数一起使用时,它的处理方式不同,我怀疑这只是一个疏忽。@Daniel:我不认为您在“部分应用函数”和“匿名函数文字”之间所作的区分存在。可以说,这是一个bug,因为
f(id=e)
不再意味着赋值。以前的语法是“赋值或命名的arg”,现在它只是“命名的arg”,表达式是
,OP的直观读数是正确的。啊,我明白了!现在我有了更深的理解。。。。最紧的非退化范围。。。我会记住的!非常感谢。但可以说,这是一个bug<代码>WithUnit(,“cm”)之所以有效,是因为它被视为部分应用的函数,而不是匿名函数文本。当与命名参数一起使用时,它的处理方式不同,我怀疑这只是一个疏忽。@Daniel:我不认为您在“部分应用函数”和“匿名函数文字”之间所作的区分存在。可以说,这是一个bug,因为
f(id=e)
不再意味着赋值。以前的语法是“赋值或命名arg”,现在它只是“命名arg”,表达式是
,OP的直观读数是正确的。