Являются ли статические методы более комбинируемыми? - PullRequest
0 голосов
/ 06 февраля 2019

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

 case class Cell(topLeft: Coordinate, botRight: Coordinate) {

  def up: Cell = {
    Cell(
      Coordinate(topLeft.x + 0, topLeft.y - 1)
      , Coordinate(botRight.x + 0, botRight.y - 1))
  }
}

Считается правильным, что эта операция up должна быть методом экземпляра и вызываться так:

val cell = Cell(x,y)
cell.up

Однако, если я сделаю эти операции статическими функциями, принадлежащими объекту-компаньону, напримеритак,

object Cell{

  def up(cell: Cell): Cell = {
    Cell(
      Coordinate(cell.topLeft.x + 0, cell.topLeft.y - 1)
      , Coordinate(cell.botRight.x + 0, cell.botRight.y - 1))
  }
...
}

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

См. Обе прокомментированные строки ниже.

    private def move(move: Cell => Cell, team: Team, nucleus: Coordinate): Team = {

    val (mover, others) = team.cells.partition(_.nucleus == Some(nucleus))

    val newCell = move(mover.head)  // Works using STATIC move

    val newCell = mover.head.move  // Doesn't Work (needs .up, .down etc...)

    if(mover.nonEmpty){
      if(isValidCellState(newCell)) {
        Team(newCell :: others)
      }else{
        throw new BadMoveException("Invalid move from this position")
      }
    }else{
      throw new BadMoveException("You didn't select a cell to move")
    }
  }

Если я хочу обе функции:

  1. Возможность вызова функций, таких как методы экземпляра
  2. Использование функций в качестве параметров для других функций

Кажется, мне нужно определить методыстатически в объекте-компаньоне, но затем определите их в классе, ссылаясь на статическую реализацию

def up = Cell.up(this)

Это плохая практика, она кажется немного вонючей.

1 Ответ

0 голосов
/ 06 февраля 2019

Scala позволяет легко создавать лямбды для таких случаев:

move(_.up, team, nucleus)

Вы заметите, что это даже меньше, чем Cell.up.По этой причине, кажется, нет необходимости также определять их в компаньоне.

...