Scala模式匹配提取器右关联性

时间:2015-06-02 10:57:32

标签: scala pattern-matching

我正在玩Scala的模式匹配。到目前为止我所知道的是,一个名为operator的提取器是左关联的,一个名为方法或类型的提取器是右关联的。

我目前的方法看起来像这样:

object Foo {
  def unapply(tokens: Seq[String]): Option[(Seq[String], String)] = // do something
}

// ...

object Main extends App {
  Seq("hi", "bye") match {
    case xs Foo foo2 Foo foo1 => // do something with result
    case _ => // handle error
  }
}

这有点不愉快,因为它需要我反向编写我的匹配或由于正确的关联性而反向匹配它们。我更愿意,如果我能写出这样的东西:

object Foo {
   def unapply(tokens: Seq[String]): Option[(String, Seq[String])] = // do something
}

// ...

object Main extends App {
  Seq("hi", "bye") match {
    case foo1 Foo foo2 xs => // do something with result
    case _ => // handle error
  }
}

有没有办法为提取器保留一些可读的名称并使其保持关联状态?

提前致谢。

2 个答案:

答案 0 :(得分:5)

您需要使用:结束班级名称 来自Scala Specifications中缀操作,6.12.3):

  

操作员的关联性由操作员的最后一个确定   字符。以冒号':'结尾的运算符是右关联的。所有   其他运算符是左关联的。

这样:

scala> object `Foo:` {
         def unapply(tokens: Seq[String]): Option[(String, Seq[String])] =
           Some((tokens.head, tokens.tail))
       }
defined object Foo$colon

scala> Seq("hi", "bye", "world") match {
         case foo1 `Foo:` foo2 `Foo:` foo3 =>  println(s"$foo1 $foo2 $foo3")
       }
hi bye List(world)

不幸的是,您需要使用反引号,因为Foo:不是有效的标识符。

答案 1 :(得分:0)

我不确定我的问题是否正确,但我认为你要求这样的事情:

var selected = reader["gorusmeYapilanOkul"].ToString();
if(RadioButtonList_ayrintiGorusmeYapilanOkul.Items.FindByValue(selected)!=null)
    RadioButtonList_ayrintiGorusmeYapilanOkul.Items.FindByValue(selected).Selected = true;