51CTO编辑推荐:
Scala编程语言专题
Scala支持case类的概念。case类也是正规的类,暴露其构造器参数,并通过模式匹配提供递归解构机制。 以下是由抽象超类Term和三个具体case类Var,Fun,和App组成的类层次的例子。
-
abstract
class
Term
-
case
class
Var(name: String)
extends
Term
-
case
class
Fun(arg: String, body: Term)
extends
Term
-
case
class
App(f: Term, v: Term)
extends
Term
这个类层次可以用来表现无类型lambda算子。为了便于case类实例的构建,Scala不需要使用new原语。只要简单地把类名用作函数即可。举例如下:
-
Fun(
"x"
, Fun(
"y"
, App(Var(
"x"
), Var(
"y"
))))
case类的构造器参数被当作公开值并可以直接被访问。
-
val x = Var(
"x"
)
-
Console.println(x.name)
对于每个case类,Scala编译器将产生实现了结构相等性检查的equals方法和一个toString方法。举例如下:
-
val x1 = Var(
"x"
)
-
val x2 = Var(
"x"
)
-
val y1 = Var(
"y"
)
-
println(
""
+ x1 +
" == "
+ x2 +
" => "
+ (x1 == x2))
-
println(
""
+ x1 +
" == "
+ y1 +
" => "
+ (x1 == y1))
-
Var(x) == Var(x) =>
true
-
Var(x) == Var(y) =>
false
只有在分解数据结构的时候用到了模式匹配的情况下,定义case类才是有意义的。以下的对象为我们的lambda算子的展示定义了漂亮的打印函数:
-
object TermTest
extends
Application {
-
def printTerm(term: Term) {
-
term match {
-
case
Var(n) =>
-
print(n)
-
case
Fun(x, b) =>
-
print(
"^"
+ x +
"."
)
-
printTerm(b)
-
case
App(f, v) =>
-
Console.print(
"("
)
-
printTerm(f)
-
print(
" "
)
-
printTerm(v)
-
print(
")"
)
-
}
-
}
-
def isIdentityFun(term: Term): Boolean = term match {
-
case
Fun(x, Var(y))
if
x == y =>
true
-
case
_ =>
false
-
}
-
val id = Fun(
"x"
, Var(
"x"
))
-
val t = Fun(
"x"
, Fun(
"y"
, App(Var(
"x"
), Var(
"y"
))))
-
printTerm(t)
-
println
-
println(isIdentityFun(id))
-
println(isIdentityFun(t))
-
}
我们的例子里,函数print表达为开始于match关键字的,由一系列的case Pattern => Body子句组成的模式匹配语句。
上面的程序还定义了函数isIdentityFun,用来检查是否给定的term对应于一个简单的身份函数。这个例子使用了深度模式和护卫语句。在使用给定值匹配了模式之后,护卫语句(定义于关键字if之后)被执行评估。如果返回true,匹配成功;反之,则匹配失败,并尝试下一个模式。
原文来源:
Scala官方网站
51CTO编辑推荐:Scala编程语言专题Scala支持case类的概念。case类也是正规的类,暴露其构造器参数,并通过模式匹配提供递归解构机制。 以下是由抽象超类Term和三个具体case类Var,Fun,和App组成的类层次的例子。abstract class Term case class Var(name: String) extends Term case class Fu
case
执行方式:逐一判断每个 WHEN 子句直到返回真值为止。此外,没有能够返回真值的WHEN 子句时,也会返回 ELSE 子句指定的表达式。
用法一:在返回映射时
使用
(固定字段展示内容)
select
case
'数据库字段'
when '条件1' then '满足条件的结果1'
when '条件2' then '满足条件的结果2'
else '所有条件之外的结果n'
end as '字段名称'
Scala
中
提供了比java,c更加强大的switch语句——match,而且不用担心因为忘记写break语句而发生
case
穿透
1.更好的switch
与if,类似match也是表达式,如下一个用于匹配字符的函数def charMatch(c: Char) = c match {
case
'+' => 1
case
'-' => -1
Scala
的match表达式类似于其他语言
中
的switch语句,它可以提供给你在多个备选项
中
做选择。基本上match表达式可以让你
使用
任意的模式(pattern)做选择。
1. 按值匹配
def valueMatch(fruit: String) {
fruit match {
case
"apple" => print("apple")
case
"b...
Scala
中
的try catch和Java
中
的try catch类似,可以捕捉异常并进行处理。
Scala
中
可以
使用
模式匹配来匹配不同类型的异常。
在
Scala
中
,try catch语句可以采用如下形式:
try {
// 可能抛出异常的代码
} catch {
case
e: Exception1 => // 处理 Exception1 异常
case
e: Exception2 => // 处理 Exception2 异常
} finally {
// 处理最终的收尾工作,比如关闭文件、释放资源等
在catch子句块
中
,可以
使用
模式匹配来对不同类型的异常进行处理。而finally块
中
的代码总是会在try或catch
中
的代码执行完毕后被执行,无论有没有发生异常。
使用
try catch语句的一个例子如下:
try {
// 可能抛出异常的代码
val result = 10/0
} catch {
case
e: ArithmeticException => println("发生算术异常:" + e.getMessage())
case
e: Exception => println("发生其他异常:" + e.getMessage())
} finally {
println("执行完毕")
在这个例子
中
,当运行到 `val result = 10/0` 这一行时,由于除数为0,会抛出一个算术异常。然后程序会进入catch块
中
,通过模式匹配将这个算术异常捕获,打印出异常的信息。接着,程序会执行finally块
中
的代码,打印出一条“执行完毕”的信息。