Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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 “是什么意思?”;val Class.Something(2,)=doSomething();?_Scala_Pattern Matching - Fatal编程技术网

Scala “是什么意思?”;val Class.Something(2,)=doSomething();?

Scala “是什么意思?”;val Class.Something(2,)=doSomething();?,scala,pattern-matching,Scala,Pattern Matching,我正在阅读李浩义关于解析器组合器框架的介绍,同时只了解Scala的基础知识。 我遇到了一条我完全不理解的线: val Parsed.Success(2, _) = parse("1+1", expr(_)) 来自Java,看起来很奇怪。有人知道它是干什么的吗? 提前谢谢 Java中的等价物是什么?Scala知道提取器对象-请参阅 它们主要用于模式匹配-请参阅 因此这可以与vals一起使用: val customer2ID = CustomerID("Nico") val CustomerID

我正在阅读李浩义关于解析器组合器框架的介绍,同时只了解Scala的基础知识。 我遇到了一条我完全不理解的线:

val Parsed.Success(2, _) = parse("1+1", expr(_))
来自Java,看起来很奇怪。有人知道它是干什么的吗? 提前谢谢

Java中的等价物是什么?

Scala知道提取器对象-请参阅

它们主要用于模式匹配-请参阅

因此这可以与
val
s一起使用:

val customer2ID = CustomerID("Nico")
val CustomerID(name) = customer2ID
println(name)  // prints Nico
如果解析器无法工作,您的示例将抛出一个
scala.MatchError


尝试
val Parsed.Success(2,)=parse(“1+2”,expr())
//应该是3

函数
parse
返回一个
Parsed[T]
,它与
Success
案例类的提取器(在对象
Parsed
内部)匹配

它可以改写为:

parse(“1+1”,expr())匹配{
已分析案例。成功(2,/*索引*/)=>???
}
前面的例子表明它不是完全匹配(因此
val
模式将引发
MatchError

也可以用作以下命令,以更明确地避免
MatchError

val res:Option[(Int/*value*/,Int/*index*/)]
Parsed.Success.unapply(parse(“1+2”,expr()))

其他答案从技术上解释了这是什么,但fastparse的作者为什么要这样写

val Parsed.Success(2, _) = parse("1+1", expr(_))
在这里,我们看不到任何变量实际上是在该语句执行后可用的意义上绑定的?这看起来像是一个副作用的返回装置。我相信作者正在使用这种技术作为断言的替代

assert(parse("1+1", expr(_)) == Parsed.Success(2, 3))
但他们想强调的是,他们并不关心
成功[+T](value:T,index:Int)
索引
值,这是使用常规
断言

assert(parse("1+1", expr(_)) == Parsed.Success(2, _)) // error: missing parameter type for expanded function

它是模式匹配的一种形式。这意味着
parse(“1+1”,expr())
的结果应该是
解析的。Success
的第一个元素必须是2(
1+1
的结果),第二个组件可以是任何组件,因为它将被忽略。从类型推断的角度来看,匹配是有效的,但它在运行时不会失败(例如,如果您键入的不是
1+1
,而是
1+2
)。它实际上不使用提取器对象,但是来自伴随对象的
不应用地
为case类
Success
(对于任何case类)生成。“提取器对象是一个带有
方法的对象,不适用于
方法”-companion(case类的)似乎是提取器对象的一个示例。