У меня есть класс дел с именем Ячейка , и у него есть методы без параметров для перемещения ячеек вверх, вниз, влево, вправо ...
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")
}
}
Если я хочу обе функции:
- Возможность вызова функций, таких как методы экземпляра
- Использование функций в качестве параметров для других функций
Кажется, мне нужно определить методыстатически в объекте-компаньоне, но затем определите их в классе, ссылаясь на статическую реализацию
def up = Cell.up(this)
Это плохая практика, она кажется немного вонючей.