私は Scala API (ちなみに Twilio 用) に取り組んでおり、操作にはかなりの量のパラメーターがあり、その多くには適切なデフォルト値があります。入力を減らして使いやすさを向上させるために、名前付き引数と既定の引数を持つケース クラスを使用することにしました。たとえば、TwiML Gather 動詞の場合:
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE, // Infinite
callbackUrl: Option[String] = None,
timeout: Int = 5
) extends Verb
ここで重要なパラメーターはcallbackUrlです。これは、値が指定されていない場合、値が適用されないという意味で、実際にオプションである唯一のパラメーターです (これは完全に正当です)。
API の実装側でモナド マップ ルーチンを実行するために、オプションとして宣言しましたが、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)
私が知る限り、これを解決するには 2 つのオプション (しゃれなし) があります。API クライアントが暗黙的な変換をスコープにインポートするようにします。
implicit def string2Option(s: String) : Option[String] = Some(s)
または、ケース クラスを null デフォルトで再宣言し、それを実装側のオプションに変換することもできます。
case class Gather(finishOnKey: Char = '#',
numDigits: Int = Integer.MAX_VALUE,
callbackUrl: String = null,
timeout: Int = 5
) extends Verb
私の質問は次のとおりです。
- 私の特定のケースを解決するためのよりエレガントな方法はありますか?
- より一般的に: 名前付き引数は新しい言語機能 (2.8) です。Options と名前付きのデフォルト引数は、油と水のようなものであることが判明するでしょうか? :)
- この場合、null の既定値を使用するのが最善の選択でしょうか?