相关疑难解决方法(0)

是否可以在case语句的主体中(或者在使用提取器的任何其他地方)使用参数自定义提取器?

基本上,我希望能够构建一个自定义提取器,而无需在使用它之前将其存储在变量中.

这不是我将如何使用它的一个真实示例,它更可能用于正则表达式或其他字符串模式(如构造),但希望它能解释我正在寻找的内容:

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 unapply extractor

14
推荐指数
2
解决办法
1158
查看次数

这个案例类匹配模式是如何工作的?

我刚刚在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)

是砰的操作员!与以冒号结尾的方法类似的特殊情况:

scala pattern-matching case-class

13
推荐指数
1
解决办法
1684
查看次数

使用Scala案例类建模

我正在尝试将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)

scala pattern-matching case-class extractor

6
推荐指数
1
解决办法
1663
查看次数

标签 统计

scala ×3

case-class ×2

extractor ×2

pattern-matching ×2

unapply ×1