2015-07-21 5 views
2

Есть ли способ ограничить значения параметра в функции Scala? Например, если у меня есть один флаг paramate, и я хочу, чтобы пользователь мог отправлять значения 0 или 1 в качестве допустимых значений для этого параметра.Scala: ограничить значения параметров

Я знаю, что могу написать простую инструкцию if, которая проверила значения и вернула какое-либо сообщение об ошибке, если оно неприемлемо, но я подумал, что может быть более краткий способ сделать это, скажем, когда параметр указан в объявлении функции.

ответ

3

Как я обычно подходить к этому в Scala, чтобы сделать базовую черту с объектами случай:

sealed trait Color 
case object Red extends Color 
case object Green extends Color 
case object Blue extends Color 

//... 
def myFn(arg:Color) = //... 
+0

Подчеркивание написал хороший пост в блоге на эту тему - http://underscore.io/blog/posts/2015/06/02/everything-about-sealed.html. –

+0

Спасибо, это прекрасно и на самом деле решает другую проблему, которая у меня есть. @KevinMeredith, хочу, чтобы я мог получить вам несколько баллов за ссылку! –

3

Что вы хотите «зависимый набрав». Такой вызов будет ошибкой компиляции на языке с поддержкой. К сожалению, scala не поддерживает его.

Двумя типичными обходными решениями были бы использование ADT вместо более крупного типа или обертка с ограниченным методом построения.

object ZeroOrOne { 
    def apply(i: Int): Option[ZeroOrOne] = if (i == 0 || i == 1) Some(ZeroOrOne(i)) else None 
} 
case class ZeroOrOne private (i: Int) 
def doStuff(zo: ZeroOrOne) { // use zo.i } 

или

sealed trait EnableStatus 
case object Enabled extends EnableStatus 
case object Disabled extends EnableStatus 

def setEnabled(es: EnableStatus) 
Смежные вопросы