Czy możliwe jest wykorzystanie niejawnych konwersji parametrów w ekstraktorach (nie dotyczy) w Scali?
Stworzyłem klasę o nazwie CaseInsensitive, która otacza łańcuch (patrzImplementacja klasy łańcuchowej, która nie uwzględnia liter w Scali).
Stworzyłem klasę case, która ma zmienną składową typu CaseInsensitive, więc pobiera domyślną metodę unapply, która wyodrębnia zmienną typu CaseInsensitive, ale miałem nadzieję, że użyję jej w ten sposób:
case class PropertyKey( val name : CaseInsensitive )
val foo = new PropertyKey("foo")
val result = foo match {
case PropertyKey("foo") => true
case _ => false
}
Kod ten nie kompiluje się: (w linii ekstraktora, a nie w linii konstruktora)
type mismatch;
found : java.lang.String("foo")
required: com.acme.CaseInsensitive
Ale myślałem, że moje niejawne konwersje z String na CaseInsensitive umożliwią to skompilowanie, a nie konieczność pisania bardziej szczegółowego:
case class PropertyKey( val name : CaseInsensitive )
val foo = new PropertyKey("foo")
val result = foo match {
case PropertyKey(CaseInsensitive("foo")) => true
case _ => false
}
Oto implementacja funkcji 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))
}
}