我创建了一个名为 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
}
这是 CaseInsensitive 的实现:
/** 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))
}
}
您始终可以定义一个方便的提取器并导入它(随意使用更短的名称):
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即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)