【问题标题】:Pattern matching checking for type of tuple元组类型的模式匹配检查
【发布时间】:2018-07-18 03:14:02
【问题描述】:

我正在尝试使用 Scala 的模式匹配功能来检查第一个参数的类型,并接受第二个参数的任意类型——尽管我不确定这在 Scala 的语法上是如何工作的,因为我还很新,并且我找不到任何关于 Scala 中元组如何相互工作的信息,因为它与模式匹配和 case 语句有关。

我最初的尝试:

case foo => (eval(e1, e2), eval(e1, e2)) match
{
    case (S(e1), _) => (bar(e1, e2) + bar(e1, e2))
    case _ => ???
}

其中,这个应该,在这种情况下,检查第一个参数是一个字符串,并接受第二个是什么,然后做任何bar想要的。

此外,我还看到过这样的例子:

case (_: String, _: Int) => ???

但是,我不清楚您如何在右手声明中引用这些参数。

在语句中引用这些 _ 参数的正确方法是什么?

【问题讨论】:

  • 以防万一你不知道,case (S(e1), _) 中的e1 不是eval(e1, e2) 中的e1。例如val a = "x"case class S(s: String); S("y") match { case S(a) => S(a) } // res1: S = S(y)
  • @LeoC 对,它们应该包含在不同的范围内。对我来说,这是一个糟糕的变量名选择。哎呀!后来我在自己的实现中将它们重命名为 lref 和 rref。

标签: scala pattern-matching match


【解决方案1】:

您使用: 前缀类型。下面的例子。您可以使用变量引用任何值,而无需显式声明类型。

Scala REPL

scala> :paste
// Entering paste mode (ctrl-D to finish)

("Java", 1) match {
  case (str: String, v) => println(s"value: $v")
  case _ => println("something")
}

// Exiting paste mode, now interpreting.

value: 1

【讨论】:

  • 你是用 s 引用字符串吗? s 是 Scala 中字符串的关键字,还是...只是假设 s 是您找到 v 后的剩余部分?字符串之外的 $ 是必需的吗?
  • s 在 scala 中没有保留
  • 那么我对s"value: $v" 中发生的事情有点困惑。 s 在做什么?您似乎没有处理字符串"Java",而是删除了该值。
  • s 用于字符串插值。更多信息在这里docs.scala-lang.org/overviews/core/string-interpolation.html
  • 优秀——这更有意义。谢谢@pamu
猜你喜欢
  • 2019-04-20
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多