相关疑难解决方法(0)

是Scala API中的选项和命名的默认参数,如石油和水吗?

我正在研究Scala API(顺便说一下,对于Twilio),其中操作具有相当多的参数,其中许多具有合理的默认值.为了减少输入并增加可用性,我决定使用带有命名和默认参数的case类.例如对于TwiML Gather动词:

case class Gather(finishOnKey: Char = '#', 
                  numDigits: Int = Integer.MAX_VALUE, // Infinite
                  callbackUrl: Option[String] = None, 
                  timeout: Int = 5
                  ) extends Verb
Run Code Online (Sandbox Code Playgroud)

这里感兴趣的参数是callbackUrl.它是唯一真正可选的参数,如果没有提供任何值,则不会应用任何值(这是完全合法的).

我已经宣布它是一个选项,以便在API的实现方面使用它来执行monadic map例程,但这给API用户带来了额外的负担:

Gather(numDigits = 4, callbackUrl = Some("http://xxx"))
// Should have been
Gather(numDigits = 4, callbackUrl = "http://xxx")

// Without the optional url, both cases are similar
Gather(numDigits = 4)
Run Code Online (Sandbox Code Playgroud)

据我所知,有两种选择(没有双关语)来解决这个问题.要么让API客户端导入隐式转换到范围:

implicit def string2Option(s: String) : Option[String] = Some(s)
Run Code Online (Sandbox Code Playgroud)

或者我可以使用null默认值重新声明case类,并将其转换为实现端的选项:

case class Gather(finishOnKey: Char = '#', 
                  numDigits: Int = …
Run Code Online (Sandbox Code Playgroud)

scala optional-parameters named-parameters

41
推荐指数
3
解决办法
2万
查看次数

带有泛型返回类型的可选函数参数

你将如何实现通过正则表达式解析一些输入并将创建的字符串转换为其他类型的类?我的方法是:

class ARegex[T](regex:Regex, reform:Option[String => T]){
  def findFirst(input:String):Option[T] = {
    (regex.findFirstIn(input), reform) match{
      case (None, _) => None
      case (Some(s), None) => Some(s) // this won't compile because of type mismatch
      case (Some(s), Some(fun)) => Some(fun(s))
    }
  }
}

class BRegex[T](regex:Regex, reform:Option[String => T]) {
  def findFirst(input:String) = {  //returns Option[Any] - erasure
    (regex.findFirstIn(input), reform) match{
      case (None, _) => None
      case (Some(s), None) => Some(s)
      case (Some(s), Some(fun)) => Some(fun(s))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

types scala

2
推荐指数
1
解决办法
859
查看次数