Как бы я сделал это в Scala? - PullRequest
       28

Как бы я сделал это в Scala?

0 голосов
/ 07 февраля 2011

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

Мне нужно сделать это в Scala, но явозникли проблемы с сортировкой:

final Filter<GameObject> filter = new Filter<GameObject>() {
    public boolean accept(GameObject o) {
        ...
    }
};

Банкомат у меня есть, но он даже не скомпилируется:

val filter = new Filter[GameObject] {
    override def accept(o: GameObject) {
        ...
    }
}

Заранее спасибо.

Редактировать:

Вот весь объект на данный момент:

object Targeter extends LoopTask {

  val filter = new Filter[GameObject] {
    override def accept(o: GameObject) = { true }
  }

  //  Overriding a method in the LoopTask class
  override def loop() = {
    100
  }
}

Ответы [ 4 ]

7 голосов
/ 07 февраля 2011

Я думаю, вы пропустили тип возврата:

override def accept(o: GameObject) = {...}

или

override def accept(o: GameObject): Boolean = {...}

Эти два варианта одинаковы (при условии, что вы на самом деле возвращаете логическое значение в теле этого метода).


Если вы определите accept метод следующим образом:

override def accept(o: GameObject) {...}

тогда это так же, как:

override def accept(o: GameObject): Unit = {...}

И Unit эквивалентен void в Java.

5 голосов
/ 07 февраля 2011

Старайтесь сохранять любой код, написанный на Scala, настолько идиоматичным, насколько это возможно, здесь вам поможет удобная функция конвертера:

def gameFilter[T](fn: T => Boolean) = new Filter[T] {
  override def accept(x: T) = fn(x)
}

Который затем можно использовать как:

val filter = gameFilter[GameObject](_ => true)

Или, если вы когда-либо будете фильтровать только на GameObject s:

def gameFilter(fn: GameObject => Boolean) = new Filter[GameObject] {
  override def accept(x: GameObject) = fn(x)
}

val filter = gameFilter( _ => true )
1 голос
/ 07 февраля 2011
override def accept(o: GameObject) {

должно быть

override def accept(o: GameObject) = {

.. это стандартная ошибка новичка.Кроме того, было бы безопаснее объявить тип возвращаемого значения:

override def accept(o: GameObject):Boolean = {

Вы знаете, я предполагаю, что вы можете просто использовать функцию для замены ваших фильтров:

val myFilter : GameObject => Boolean = ...

, а затем вы можетепросто делай так:

val gameObjects:List[GameObject] = ...
val filteredGameObjects = gameObjects filter myFilter
0 голосов
/ 08 февраля 2011

"Весь объект пока" компилируется нормально, предполагая, что другие классы:

  abstract class LoopTask {
    def loop(): Int
  }

  case class GameObject

  abstract class Filter[T] {
      def accept(o:T):Boolean
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...