我知道我无法在 Scala break
声明中使用match
。
是否有匹配案例以及以下案例的原因?
例如,在 Java 中,我可以执行以下操作:
int i=3;
switch(i) {
case 1:
a();
break;
case 2:
b();
case 3:
c();
case 4:
d();
break;
default: z();
}
我如何在 Scala 上做同样的事情?
答案 0 :(得分:3)
您需要两次(或更多次)编写代码。在Scala中,不可能从case
转到下一个val i = 3
i match {
case 1 => a()
case 2 => {
b()
c()
d()
}
case 3 => {
c()
d()
}
case 4 => d()
case _ => z()
。即使在可能的语言中,通常也不是一个好主意;它可能是难以发现的错误的来源(尽管有些情况下可以有效地使用它)。
在Scala中代码看起来像这样:
{{1}}
答案 1 :(得分:2)
可以这样做,但您必须定义自己的String url="Your Url";
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(browserIntent);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
方法。
switch
这有效,但它的语法略显不正统。因为它需要// switch statement with dropthrough logic
def switch[T](i: T)(actions: (T, () => Unit)*)(default: => Unit) = {
val acts = actions.dropWhile(_._1 != i).map{_._2}
if (acts.isEmpty) default
else acts.foreach{_()}
}
而不是return
,所以不应该有break
之后的代码。
switch
总而言之,可能比它的价值更麻烦。
答案 2 :(得分:0)
您无法将Java代码直接转换为Scala而无需重复代码,因为您无法在一次传递中在匹配语句中执行多个备选方案。 但是,为避免替代方案中的代码重复,您可以做的是多次处理相同的匹配语句,
例如
@tailrec
def switch(x : Int): Unit =
x match {
case 1 => a()
case 2 => b(); switch(3)
case 3 => c(); switch(4)
case 4 => c()
case _ => z()
}
switch(3)