1

我创建了一个名为 CaseInsensitive 的类,它包装了一个字符串(请参阅实现一个在 Scala 中执行不区分大小写比较的字符串类)。

我创建了一个 case 类,它有一个 CaseInsensitive 类型的成员变量,所以它有一个默认的 unapply 方法,该方法提取一个 CaseInsensitive 类型的变量,但我希望像这样使用它:

case class PropertyKey( val name : CaseInsensitive )

val foo = new PropertyKey("foo")
val result = foo match {
  case PropertyKey("foo") => true
  case _ => false
}

此代码无法编译:(在提取器行,而不是构造器行)

type mismatch;
 found   : java.lang.String("foo")
 required: com.acme.CaseInsensitive 

但我认为我从 String 到 CaseInsensitive 的隐式转换可以编译,而不是我必须输入更详细的内容:

case class PropertyKey( val name : CaseInsensitive )

val foo = new PropertyKey("foo")
val result = foo match {
  case PropertyKey(CaseInsensitive("foo")) => true
  case _ => false
}

这是不区分大小写的实现:

/** Used to enable us to easily index objects by string, case insensitive
 * 
 * Note: this class preserve the case of your string!
 */
case class CaseInsensitive ( val _s : String ) extends Proxy {
  require( _s != null)

  val self = _s.toLowerCase
  override def toString = _s

  def i = this // convenience implicit conversion
}

object CaseInsensitive {
  implicit def CaseInsensitive2String(c : CaseInsensitive) = if ( c == null ) null else c._s
  implicit def StringToCaseInsensitive(s : String) = CaseInsensitive(s)

  def fromString( s : String ) = s match {
    case null => None
    case _ => Some(CaseInsensitive(s))
  }
}
4

1 回答 1

4

您总是可以定义一个方便的提取器并导入它(随意使用更短的名称):

object PropertyKeyCI {
  def unapply(p: PropertyKey): Option[String] = Some(p.name.self)
}

那么,提取是:

  val foo = new PropertyKey("foo")
  val result = foo match {
    case PropertyKeyCI("foo") => true
    case _ => false
  }

(坏语义警报)

尽管请注意,这对于 PropertyKeyCI("Foo") 将匹配为 false,因为您的“CaseInsensitive”类实际上是一个“LowerCase”类。我这样说是因为我很难想象 unapply() 方法的期望行为是什么。从您的案例类默认值中,您将返回原始(未小写)字符串的 Option[String] ,这会产生这种不直观的行为:

  // result == false !!!!
  val foo = new CaseInsensitive("Foo")
  val result = foo match {
    case CaseInsensitive("foo") => true
    case _ => false
  }
  val CaseInsensitive(s) = "aBcDeF"
  assertFalse(s == "abcdef")

哇……扔了。只需使用 DOS。

于 2009-11-30T18:18:02.653 回答