Синтаксис для написания метода, который принимает объект, который имеет определенный метод - PullRequest
3 голосов
/ 02 ноября 2011

Я хочу написать общий вспомогательный метод:

def using(closeable: [B has close() method], callback: [B has close() method] => A): A {
  try {
    callback(closeable)
  } finally {
    closeable.close()
  }
}

с намерением использовать это для всего, что имеет метод close ():

using(new FileInputStream(...)) {
  stream => stream.read()
}

using(dataSource.getConnection) {
  conn => using(conn.createStatement()) {
    statement => using(statement.executeQuery("...")) {
      rs => rs.getString(1)
    }
  }
}

То, что я ищу, так это имя, чтобы я мог сам искать синтаксис и сам синтаксис.

Ответы [ 3 ]

8 голосов
/ 02 ноября 2011

Чтобы дать его полностью

type Closeable = {def close() }
def using[A,B](a: A with Closeable)(f: A => B) =
 try { f(a) } finally { a.close() }

(вы также можете написать A {def close()} вместо A with Closeable)

Тест:

case class X(i: Int) { def close() = println("closed") }
using(X(3)){x => println("i is " + x.i) }

вывод

1012

3

закрыто

5 голосов
/ 02 ноября 2011

Это называется структурный тип .

4 голосов
/ 02 ноября 2011

Дебильски прав, синтаксис для этого будет closable: { def close() }

Редактировать: Вот ссылка на альтернативную Scala-реализацию .NET, например, с использованием конструкции , которую вы хотите использовать на основе объекта, и это метод применения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...