Сохранение миксин-черт с возвращенным значением в Scala - PullRequest
1 голос
/ 26 января 2012

У нас есть Selenium WebElement, который мы получаем из Java API, но мы создали класс Scala, Element и смешали более специфические черты (например, Clickable, Submittable и т. Д.).

Наш метод выглядит следующим образом:

toScalaElement(e : WebElement) = {
   e.type match { 
      case Input => new Element(e) with Submittable
      case Link  => new Element(e) with Clickable
      ...
      case _ => new Element
   }
}

Тип возвращаемого значения всегда Element, так как это корневой класс всех случаев.Тем не менее, мы хотели бы сохранить черты миксина при его возврате.

Было рекомендовано взглянуть на разработчиков в API коллекций Scala, но мы не уверены, как это относится к этому конкретному приложению.Очевидно, что если есть лучший способ, чем черты mixins, то это решение будет оценено.

Обновление : я изменил регистр, чтобы сопоставить его с подтипами вместо строк, но суть вопроса остается неизменной,

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Я не думаю, что это выполнимо. Метод в целом должен иметь один тип возвращаемого значения. В случае компоновщиков этот тип возвращаемого значения является общим и поэтому может отличаться в зависимости от вызова метода, но компилятору нужны аргументы, чтобы иметь разные типы для выбора компоновщика. Это выглядит так:

case class WebElementConverter[T1, T2](f: T1 => T2) {
  def convert(e: T1) = f(e)
}

object WebElementConverter {
  implicit val inputConverter = WebElementConverter[Input, Element with Submittable](x => new Element(x) with Submittable)
  // other converters
}

def toScalaElement[T1 <: WebElement, T2 <: Element](e : T1)(implicit b: WebElementConverter[T1, T2]) = b.convert(e)

И теперь вы можете получить желаемый результат здесь

val i = new Input // same as val i: Input = new Input
toScalaElement(i)

но не здесь:

val i: Element = new Input
toScalaElement(i) // looks for an implicit WebElementConverter[Element, <some type>]

Так что если статический тип e просто WebElement, сборщики не помогут.

0 голосов
/ 26 января 2012

type является ключевым словом Scala, и хотя я ничего не знаю о Selenium, Google его API показывает, что type метод WebElement не возвращает String,Похоже, вы неправильно понимаете, что делает ключевое слово type, и как работает сопоставление с образцом.Вы должны посмотреть их, но вкратце, если у вас есть класс Input, который является подклассом WebElement, вы можете сопоставить тип с

def toScalaElement(e: WebElement) = e match { 
  case x: Input => new Element(x) with Submittable
  // etc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...