如何使用Scala中的模式匹配以惯用的方式安排退货订单

时间:2016-11-06 01:14:14

标签: scala

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! TableViewCell
    cell.label.text = todoData?[indexPath.row] as? String
    return cell
}

我想我可以用更惯用的方式使用模式匹配来写这个

3 个答案:

答案 0 :(得分:6)

   def arrange(str1: String, str2: String) = str1 match {
     case "YELLOW" => str1 -> str2
     case _ => str2 -> str1
   }

答案 1 :(得分:1)

有几种方法可以改进您的代码。

首先,if是表达式,而不是语句。 (Scala中的几乎所有内容都是表达式。)因此,您只需return if表达式的结果而不是return各个分支表达式:

def arrange(str1: String, str2: String): (String, String) = {
  return if (str1 == "YELLOW") {
    (str1, str2)
  } else {
    (str2, str1)
  }
}

其次,在块,函数或方法中计算的最后一个表达式的值是整个块,函数或方法的值,因此我们可以完全删除return

def arrange(str1: String, str2: String): (String, String) = {
  if (str1 == "YELLOW") {
    (str1, str2)
  } else {
    (str2, str1)
  }
}

接下来,如果一个块只包含一个单独的表达式,那么您就不需要该块,因此您可以删除括号。这适用于if分支:

def arrange(str1: String, str2: String): (String, String) = {
  if (str1 == "YELLOW") (str1, str2) else (str2, str1)
}

和方法体:

def arrange(str1: String, str2: String): (String, String) =
  if (str1 == "YELLOW") (str1, str2) else (str2, str1)

最后,Scala有返回类型推断;通常,您不需要明确声明方法的返回类型。你可以说明它,但它通常只适用于不明显的情况。

def arrange(str1: String, str2: String) =
  if (str1 == "YELLOW") (str1, str2) else (str2, str1)

所以,这看起来已经比原始版本好很多了,即使是纯粹的语法更改,也没有像切换到模式匹配那样进行任何语义更改。

答案 2 :(得分:0)

如果你真的想使用模式匹配:

<script type="text/javascript">

// Run function after page loaded
document.addEventListener('DOMContentLoaded', function() {
    show_map_theo_address("some where, America");
}, false);

    // This is the minimum zoom level that we'll allow
    function show_map_theo_address(address) {
        var geocoder, vitri;
        var minZoomLevel = 15;
        geocoder = new google.maps.Geocoder();
        if (geocoder) {
            geocoder.geocode({
                'address': address
            }, function (results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
                        vitri = results[0].geometry.location;
                        var map = new google.maps.Map(document.getElementById('map_canvas'), {
                            zoom: minZoomLevel,
                            center: new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng()),
                            mapTypeId: google.maps.MapTypeId.ROADMAP
                        });
                        }
                    }
                }
            });
        }

    }

但是对于像这样的简单条件,def arrange(str1: String, str2: String) = str1 match { case "YELLOW" => (str1, str2) case _ => (str2, str1) } 就是我们真正需要的。要在问题“惯用”中进行表达,只需删除if,因为在Scala中,return是表达式而不是流控制语句:

if

principle of least power是很好的指导:

http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLeastPower.html