2014-11-12 2 views
0

Я хотел улучшить сопоставления с образцом на основе подмешать техники , например:Scala шаблону с Mixins

trait Base { 
    def match(x:Any):String 
} 

trait HandleAString { 
    def match(x:Any):String = x match { 
    case "A" => "matched A string" 
    } 
} 

trait HandleOneInt { 
    def match(x:Any):String = x match { 
    case x:Int if (x==1) => "matched 1 int" 
    } 
} 


//main 
val handler = new Base extends HandleOneInt with HandleAString 
println(handler.match("a")) //should print "matched A string" 
println(handler.match(1)) //should print "matched 1 int" 
println(handler.match(2)) //should throw exception 

если у вас есть какой-либо другой метод я хотел бы услышать о том, что ...

+0

Ваш вопрос мне не ясен: вы спрашиваете о том, как заставить ваш код работать, или вы просите другую технику, которая не использует mixins? Также: Какова цель этого специализированного соответствия? Вы хотите, чтобы иметь возможность передавать совпадение в качестве объекта, или вам нужно сопоставлять то, что не может быть легко выражено с помощью выражения 'match' Scala? В этом примере было бы разумнее просто называть 'whatver match {case" a "=> ... case 1 => ...}' –

+1

В чем вопрос? Обратите внимание, что 'match' является зарезервированным ключевым словом, поэтому вам нужно будет вызвать ваш метод' Match' или '_match'. –

ответ

5

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

val handler1: PartialFunction[Any, String] = { 
    case "A" => "matched A string" 
} 
val handler2: PartialFunction[Any, String] = { 
    case x:Int if (x==1) => "matched 1 int" 
} 

val manyHandlers = List(handler1, handler2) 
val handler = manyHandlers.reduce(_.orElse(_)) 

println(handler("A")) // "a" won't match, match is exact 
println(handler(1)) 
println(handler(2)) 
Смежные вопросы