scala错误非法变量模式匹配案例中的模式替代

时间:2016-04-20 16:33:58

标签: scala pattern-matching

我是scala的新手。我正在写一个模式匹配如下:

  val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
  show(capitals.get("test"))
  def show(x: Option[String]) = x match {
    case Some(s) | None  => s
  }

我收到错误:

Error: illegal variable in pattern alternative
    case Some(s) | None  => s
              ^

我试图看看我如何能够像在java中的if语句中那样实现或条件

  

if(str == null || str.isEmpty())

你能帮忙重写代码还是指出错误?

问题:如何在案例模式匹配中提及或条件?

4 个答案:

答案 0 :(得分:2)

我认为这是你想要实现的目标。如果<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mom" android:installLocation="auto" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <permission android:name="com.arshad.map.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <!-- Permission to receive Google Maps --> <uses-permission android:name="com.arshad.map.permission.MAPS_RECEIVE" /> <!-- Maps API needs OpenGL ES 2.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > <activity android:name=".Splash" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity" android:label="@string/title_activity_main" > </activity> <activity android:name=".Add" android:label="@string/title_activity_add" android:windowSoftInputMode="adjustResize|stateVisible" > </activity> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCZdGJKBgErXwK9PP9zbG6as2ErZ__detc" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <activity android:name=".Map_activity" android:label="@string/title_activity_map" > </activity> <uses-library android:name="com.google.android.maps" android:required="true" /> </application> </manifest> 在地图返回中有值s。如果s在地图中没有值,则返回一条消息,指示如此。

s

val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo") def show(x: Option[String]) = x match { case Some(s) => s case None => "x has no value" } show(capitals.get("mani")) 的类似且更简洁的版本是show,它返回 capitals.get("mani").getOrElse("No value found")

此外,您可以使用警卫来检查No value found上的各种条件,例如第一个字符是否为大写。第一种情况仅在s以大写字母开头时匹配。

s

答案 1 :(得分:1)

匹配AndroidTestCase没有意义,因为Some(s) | None(只是没有操作,因为它没有发送案例)。

if (true || false)

答案 2 :(得分:1)

这是您在选项上模式匹配的方式:

def show(x: Option[String]) = x match {
  case Some(s) => s
  case None => "N/A"
}

(顺便说一下,你也可以这样做):

capitals.get("test").getOrElse("N/A")

现在,要将OR条件添加到模式匹配大小写,您不能使用绑定变量。然而,这将有效:

def show(x: Option[String]) = x match {
  case Some(_) | None => "a"
}

请注意,唯一的区别在于Some(_),而不是Some(s)。使用Some(s)没有多大意义,因为无论如何你都不能重用s(如果None会出现什么,那么s将会是什么?)

答案 3 :(得分:0)

最直接的解决方案是使用the method defined for maps,它将默认值作为第二个参数:

(b' -> c)