我在玩一些Scala代码,遇到了一条错误消息,我不太了解。以下是我的代码
val ignoredIds = Array("one", "two", "three")
def csNotify(x : Any): String = {
case org: String if !ignoredIds.contains(x) =>
println( s" $x should not be here")
"one"
case org : String if ignoredIds.contains(x) =>
println(s"$x should be here")
"two"
}
csNotify("four")
控制台输出是我必须知道默认函数的参数。错误点似乎指向“ String =”。为什么会这样呢?该函数应检查这两种情况并返回一个字符串?
答案 0 :(得分:4)
您的案例没有找到可以检查您的阻止的匹配项,并且您错过了匹配项:
roslaunch
因此,基本上,当您在方法中传递tmux attach
时,也必须将其匹配。
答案 1 :(得分:3)
Amit Prasad的答案已经显示了解决方法,但是解释了错误消息:
{
case org: String if !ignoredIds.contains(x) =>
println( s" $x should not be here")
"one"
case org : String if ignoredIds.contains(x) =>
println(s"$x should be here")
"two"
}
单独的(没有... match
之前)是a pattern-matching anonymous function,它只能在编译器从上下文中知道参数类型的情况下使用,即期望的类型必须是{{1} }或单一抽象方法类型(包括PartialFunction[Something, SomethingElse]
)。
此处的预期类型为Something => SomethingElse
,但两者都不是,所以编译器会抱怨不知道参数类型是什么。
答案 2 :(得分:1)
您需要在此处使用match
关键字来使用案例。您可能需要使用模式匹配的某些值。因此,请在函数中使用以下代码:
x match {
case org: String if !ignoredIds.contains(x) => ???
case org : String if ignoredIds.contains(x) => ???
}
此外,您应该考虑再添加一种默认情况。如您所知,函数x
的参数def csNotify(x: Any): String
的类型为any。因此,除了String
以外的任何内容都可以在此处传递,例如Int
或Boolean
或任何自定义类型。在这种情况下,代码将因匹配错误而中断。
还会有一个编译器警告说match is not exhaustive
,因为当前代码无法处理参数Any
的类型x
的所有可能值。
但是,如果在模式匹配中添加一个默认案例,则所有前两个案例未处理的案例(意外的类型或值)都将变为默认案例。这样,代码将更加健壮:
def csNotify(x : Any): String = x match {
case org: String if !ignoredIds.contains(org) => ???
case org : String if ignoredIds.contains(org) => ???
case org => s"unwanted value: $org" // or any default value
}
注意:请将???
替换为您想要的代码。 :)