2
trait DAOContract[T <: Entity] {
  // default create
  def create(t: T): Option[Int]
}

trait UserContract extends DAOContract[User] {
  // provide alternate create method for transactional blocks
  def create(u: User)(implicit ss: Session): Either[String, Int]
  ...
}

// DAO provides create implementation with embedded session
class UserDAO(implicit val db: Connection) 
  extends DAO[User] with UserContract {

  import db.Driver.Implicit._
  import org.scalaquery.ql._
  ...
}

コントローラーで

dao.create(model) // boom, no implicit session

ここで何かが欠けていることを願っています: scala コンパイラが上記の 2 つの create メソッド シグネチャを区別できないのはなぜですか?

基本的に、トランザクション (つまり、どちらかを返す) またはスタンドアロンの操作に対して別のメソッド命名規則を考え出さない限り、DAO 操作をオーバーロードすることは不可能です。

または、私は物事を間違った方法で行っているだけです。完全に可能性があります...

4

2 に答える 2

1

Scala がそれを禁止する理由は次のとおりです。

  1. createメソッドが次のようになると想像してください。

    def create(t: User): Function[Int,Something]
    def create(u: User)(implicit ss: Session): Either[String, Int]
    

    その後、呼び出しcreate(x)(y)はそれらの両方に適用されます。

  2. (1.) の問題は、Scala コンパイラが関数の型を注意深く調べれば解決できるかもしれませんが、非常にエラーが発生しやすくなります。このような設定では、プログラマーが間違いを犯しやすくなります。関数に異なる名前を強制することで、プログラマーは自分が何を呼び出しているかを常に知ることができます。


メソッドを同じ戻り値の型に変更し、危険な方法を取る場合は、次のようなことを試すことができます。

trait Broken {
  final def foo(x: Int)(implicit session: String = null): Option[Int] =
    if (session == null) foo1(x)
    else foo2(x, session);

  def foo1(x: Int): Option[Int]
  def foo2(x: Int, session: String): Option[Int]
}
class Example extends Broken {
  def foo2(x: Int, y: String) = Some(2)
  def foo1(x: Int) = Some(1)
}

object Test extends App {
  def withImplicit(e: Example) = {
    implicit val imp = "hey"
    e.foo(1) // (imp)
  }
  def withoutImplicit(e: Example) = e.foo(1)

  println(withImplicit(new Example()));
  println(withoutImplicit(new Example()));
}

暗黙的な値が使用可能な場合、対応するメソッドが呼び出されます。それ以外の場合は、「セッション」引数のないメソッドが呼び出されます。しかし、私はこのアプローチを強く思いとどまらせます。わずかなミスが間違ったバリアントの呼び出しにつながり、デバッグが非常に困難になります。

于 2012-10-06T10:45:30.583 に答える
0

create メソッドには異なる署名があります。1 つはどちらかを返し、もう 1 つはオプションを返します。プラス暗黙。おそらく暗黙的に使用し、両方から Option[Int] を返す必要があります

于 2012-10-06T01:08:33.097 に答える