基本上,我希望能够构建一个自定义提取器,而无需在使用它之前将其存储在变量中.
这不是我将如何使用它的一个真实示例,它更可能用于正则表达式或其他字符串模式(如构造),但希望它能解释我正在寻找的内容:
def someExtractorBuilder(arg:Boolean) = new {
def unapply(s:String):Option[String] = if(arg) Some(s) else None
}
//I would like to be able to use something like this
val {someExtractorBuilder(true)}(result) = "test"
"test" match {case {someExtractorBuilder(true)}(result) => result }
//instead I would have to do this:
val customExtractor = someExtractorBuilder(true)
val customExtractor(result) = "test"
"test" match {case customExtractor(result) => result}
Run Code Online (Sandbox Code Playgroud)
当只做一个自定义提取器时,它没有太大的区别,但如果你为case语句构建一个大的提取器列表,它可能会通过将所有提取器与它们的使用分开来使事情变得更难.
我希望答案是不,你不能这样做,但我想我先问一下:D
我刚刚在Scala actors
包中看到过这个case类:
case class ! [a](ch: Channel[a], msg: a)
Run Code Online (Sandbox Code Playgroud)
在JavaDoc中,它以下列形式描述了用法:
receive {
case Chan1 ! msg1 => ...
case Chan2 ! msg2 => ...
}
Run Code Online (Sandbox Code Playgroud)
为什么不是这样的:
receive {
case !(Chan1, msg1) => ...
case !(Chan2, msg2) => ...
}
Run Code Online (Sandbox Code Playgroud)
是砰的操作员!与以冒号结尾的方法类似的特殊情况:
我正在尝试将REST API的响应建模为案例类,我可以使用模式匹配.
我认为这是一个很好的假设继承,但我看到这是不赞成的.我知道已经存在与案例类和继承相关的问题,但我的问题更多的是关于如何在没有继承的情况下在这里建模"正确的方法" .
我从以下两个案例类开始,它们工作正常:
case class Body(contentType: String, content: String)
case class Response(statusCode: Int, body: Body)
Run Code Online (Sandbox Code Playgroud)
即REST调用将返回类似于:
Response(200, Body("application/json", """{ "foo": "bar" }"""))
Run Code Online (Sandbox Code Playgroud)
我可以模仿匹配,如:
response match {
case Response(200, Body("application/json", json)) => println(json)
case Response(200, Body("text/xml", xml)) => println(xml)
case Response(_,_) => println("Something unexpected")
}
Run Code Online (Sandbox Code Playgroud)
等工作正常.
我遇到麻烦的地方是:我想要这些案例类的帮助扩展,例如:
case class OK(body: Body) extends Response(200, body)
case class NotFound() extends Response(404, Body("text/plain", "Not Found"))
case class JSON(json: String) extends Body("application/json", json)
case class XML(xml: String) extends Body("text/xml", …
Run Code Online (Sandbox Code Playgroud)