схема cond на языке скала - PullRequest
       1

схема cond на языке скала

8 голосов
/ 06 ноября 2010

Есть ли у scala эквивалент cond схемы?

Ответы [ 3 ]

2 голосов
/ 06 ноября 2010
case class Paired(x: Int, y: Int)

def foo(x: Any) = x match {
  case string : String => println("Got a string")
  case num : Int if num < 100 => println("Number less than 100")
  case Paired(x,y) => println("Got x and y: " + x + ", " + y)
  case unknown => println("??: " + unknown)
}

Первые два оператора case показывают сопоставление с образцом на основе типа. Третий показывает использование экстрактора для разделения данных на составные части и для назначения этих частей переменным. Третий показывает переменное сопоставление с образцом, которое будет соответствовать чему угодно. Не показан _ случай:

case _ => println("what")

Который, как и шаблон переменной, совпадает с чем угодно, но не привязывает сопоставленный объект к переменной.

Класс case в верхней части - это сокращение от Scala для создания экстрактора, а также самого класса.

2 голосов
/ 06 ноября 2010

Я думаю, вы ищете match (или просто if/else if/else).

1 голос
/ 06 ноября 2010

Конечно, ни match, ни if не делают в точности то же самое, что и cond.Одна возможность состоит в следующем:

object Cond {
  def apply(clauses: Iterable[(()=>Boolean, ()=>Any)]): Any = {
    clauses find (_._1()) map (_._2()) getOrElse ()
  }
}

Этот объект принимает что-то итерируемое, где каждый элемент представляет собой пару функций, возвращающих логическое значение, и функции, возвращающей любое значение.Он пытается найти элемент, первая функция которого возвращает true, прекращает поиск, если найдет его, вызывает вторую функцию для найденного элемента и возвращает результат этой функции (или (), если ни одна не была найдена).

Примеры:

val clauses = Seq(
  ({()=>false}, {()=>println("foo")}),
  ({()=>true}, {()=>println("bar")})
)
Cond(clauses)

def checkYear(year: Int) = {
  Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}),
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}})
  ))
}

ETA: Да, я знаю, что это некрасиво, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...