Scala Range содержит (elem: Any) метод - PullRequest
       21

Scala Range содержит (elem: Any) метод

4 голосов
/ 12 сентября 2011

Очевидно, Range имеет метод, который проверяет, содержит ли он значение типа Any. Я понимаю, что это из SeqLike, но вызывает некоторые проблемы.

Например, я соответствовал часам из joda. Дата и время:

DateTime.now match {
    case d if 0 to 12 contains d.hourOfDay() => ...

Здесь d.hourOfDay () возвращает DateTime.Property, а не Int, но код все еще компилируется из-за contains(elem: Any). Есть ли способ проверить такие вызовы во время компиляции?

Ответы [ 3 ]

7 голосов
/ 12 сентября 2011

Вы можете использовать тип безопасности Скалаза (===) в сочетании с методом exists для TraversableOnce.

scala> import scalaz._
import scalaz._

scala> import Scalaz._
import Scalaz._

scala> 1 to 5 exists { _ === 2 }
res1: Boolean = true

scala> 1 to 5 exists { _ === "Hullo" }
<console>:14: error: type mismatch;
 found   : java.lang.String("Hullo")
 required: Int
       1 to 5 exists { _ === "Hullo" }
                             ^
6 голосов
/ 12 сентября 2011

Вы можете сутенер Range, чтобы добавить метод безопасного типа:

class SafeRange( range: Range ) {
  def safeContains( i: Int ) = range contains i
}

object SafeRange {
  implicit def safer( range: Range ) = new SafeRange( range )
}

Импорт неявного и вызов safeContains для любого экземпляра диапазона:

scala> import SafeRange._
import SafeRange._

scala> (0 until 10) safeContains 3
res2: Boolean = true

scala> (0 until 10) safeContains 100
res3: Boolean = false

scala> (0 until 10) safeContains "foo"
<console>:18: error: type mismatch;
 found   : java.lang.String("foo")
 required: Int
          (0 until 10) safeContains
3 голосов
/ 12 сентября 2011

Исходя из скалярных значений для Range , похоже, что нет лучшего метода Range, который вы могли бы использовать.Ваши параметры кажутся

Используйте явную сигнатуру типа:

 case d if 0 to 12 contains (d.hourOfDay(): Int) => ...

Создайте свой собственный метод:

 def containsInt(r: Range, i: Int) = ...

Кажется, что это удержание от Java equals является пре-дженериком и является лишь одним из неудобств, которые этот факт вызывает для Scala.

...