我是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())
你能帮忙重写代码还是指出错误?
问题:如何在案例模式匹配中提及或条件?
答案 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)