Проверьте, доступно ли неявное преобразование - PullRequest
9 голосов
/ 19 апреля 2011

Я пытаюсь определить, существует ли неявное преобразование и, в зависимости от него, выполнить какой-то код. Например:

if (x can-be-converted-to SomeType)
  return something(conversion(x))
else
  return someotherthing(x)

Например, x является Int и должно быть преобразовано в RichInt. Возможно ли это в Scala? Если да, то как?

Спасибо

Ответы [ 2 ]

11 голосов
/ 19 апреля 2011

Как уже упоминалось, другие последствия разрешаются во время компиляции, поэтому, возможно, вам лучше использовать классы типов для решения подобных проблем. Таким образом, вы получаете преимущество, заключающееся в том, что позже вы можете расширить функциональность на другие типы.

Также вы можете просто потребовать существующее неявное значение, но не можете напрямую выразить несуществование неявного значения, кроме аргументов по умолчанию.

Решение Жана-Филиппа, использующее аргумент по умолчанию, уже довольно хорошо, но null может быть исключено, если вы определите синглтон, который можно поместить вместо неявного параметра. Сделайте его закрытым, потому что он фактически бесполезен в другом коде и даже может быть опасным, поскольку неявные преобразования могут происходить неявно.

private case object NoConversion extends (Any => Nothing) {
   def apply(x: Any) = sys.error("No conversion")
}

// Just for convenience so NoConversion does not escape the scope.
private def noConversion: Any => Nothing = NoConversion

// and now some convenience methods that can be safely exposed:

def canConvert[A,B]()(implicit f: A => B = noConversion) =
  (f ne NoConversion)

def tryConvert[A,B](a: A)(implicit f: A => B = noConversion): Either[A,B] = 
  if (f eq NoConversion) Left(a) else Right(f(a))

def optConvert[A,B](a: A)(implicit f: A => B = noConversion): Option[B] =
  if (f ne NoConversion) Some(f(a)) else None
9 голосов
/ 19 апреля 2011

Вы можете попытаться передать его методу, которому необходим соответствующий неявный параметр со значением по умолчанию null:

def toB[A](a: A)(implicit convertFct: A => B = null) =
  if (convertFct != null)
    convertFct(a)
  else
    someOtherThing(a)

Обратите внимание, что мне любопытно проверить это во время выполнения, потому что во время компиляции компилятор знает, доступна ли такая функция преобразования.

...