zoukankan      html  css  js  c++  java
  • return语言结构 VS. scala默认返回值

    Scala函数默认使用最后一个语句的运行结果作为返回值。例如

    def distance(a:Int,b:Int):Int={

      a*a+b*b

    }

    以a*a+b*b的运行结果作为返回值。这种返回值的方式渊源于其他函数式语言Lisp/Haskell等(个人猜测)。

     在近期工作中,我写了如下的代码:

    def brand_name_to_id(map:HashMap[List[Any],List[Any]])(srcs:List[Any]):List[Any]={
        srcs(0)match {
          case brand:String=>
            if(brand.contains("_br_")){
              try {
               List(map.get(List(brand.split("_br_")(0).toLowerCase())).get.head) //我期望在这里函数直接返回
              }catch {
                case e:Throwable=>
                  println("can't map brand name to id:"+brand)
                  println(e)
              }
            }
          case _=>
        }
        List(0)//失败情况下,在这里返回
      }

    实际情况下,由于最后一行总是被执行,这个函数总是返回List(0)。

    于是改为如下形式:

    def brand_name_to_id(map:HashMap[List[Any],List[Any]])(srcs:List[Any]):List[Any]={
        srcs(0)match {
          case brand:String=>
            if(brand.contains("_br_")){
              try {
                List(map.get(List(brand.split("_br_")(0).toLowerCase())).get.head)
              }catch {
                case e:Throwable=>
                  println("can't map brand name to id:"+brand)
                  println(e)
                  List(0)
              }
            }
          case _=> List(0)
        }
      }

    即,为在所有错误分支下返回 List(0),必须在每个错误分支都写上 List(0)。这个例子只有两个错误分支。如果分支数目更多,将非常不方便。

    这时,你将会喜欢使用下面的return写法

    def brand_name_to_id(map:HashMap[List[Any],List[Any]])(srcs:List[Any]):List[Any]={
        srcs(0)match {
          case brand:String=>
            if(brand.contains("_br_")){
              try {
               return List(map.get(List(brand.split("_br_")(0).toLowerCase())).get.head)
              }catch {
                case e:Throwable=>
                  println("can't map brand name to id:"+brand)
                  println(e)
              }
            }
          case _=>
        }
        return List(0)
      }

    是不是可以得出这样的结论:return的表达能力>=Scala函数默认返回方式

    既然已经有了return这样优良的语言结构,又何必再引入另外一种返回值方式呢?这无异于画蛇添足吧。

  • 相关阅读:
    EditPlus使用技巧
    PL/SQL Dev的问题
    解决httpModules 未能从程序集 XX 加载类型 XXX 的错误
    IE浏览器无法显示背景,字体显示很大问题的解决办法[转]
    如何在Outlook2003中加入农历节气
    再谈Oracle在Windows下的权限问题
    Vista下安装布署注册的问题解决
    [转]关于管理的经典故事(员工激励)
    开始应用AJAX
    Aptana IDE 中文乱码的问题解决
  • 原文地址:https://www.cnblogs.com/linghuaichong/p/3896798.html
Copyright © 2011-2022 走看看