Scala “是什么意思?”;val Class.Something(2,)=doSomething();?
我正在阅读李浩义关于解析器组合器框架的介绍,同时只了解Scala的基础知识。 我遇到了一条我完全不理解的线: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
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类的)似乎是提取器对象的一个示例。