了解Scala默认参数消息

时间:2018-11-22 11:19:21

标签: scala methods

我在玩一些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 =”。为什么会这样呢?该函数应检查这两种情况并返回一个字符串?

3 个答案:

答案 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以外的任何内容都可以在此处传递,例如IntBoolean或任何自定义类型。在这种情况下,代码将因匹配错误而中断。

还会有一个编译器警告说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
}

注意:请将???替换为您想要的代码。 :)