静态方法是否更具可组合性?

时间:2019-02-05 23:59:59

标签: scala lambda functional-programming static

我有一个名为 Cell 的案例类,它具有用于移动单元上,下,左,右...

的无参数方法。
 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 :(得分:7)

使用scala可以很容易地为以下情况创建lambda:

move(_.up, team, nucleus)

您会注意到它比Cell.up还短。因此,似乎也不必在同伴中定义它们。