[scala] 스칼라에서 함축적 인 이해



1 Answers

경고 : 현명하게 풍자를 포함합니다! YMMV ...

루이지의 대답 은 완전하고 정확합니다. 이것은 스칼라 프로젝트에서 아주 자주 일어나는 것처럼, 영리를 지나치게 과도하게 사용하는 방법에 대한 예제로 약간 확장하는 것입니다. 실제로 "Best Practice" 가이드 중 하나에서 찾을 수 있습니다.

object HelloWorld {
  case class Text(content: String)
  case class Prefix(text: String)

  implicit def String2Text(content: String)(implicit prefix: Prefix) = {
    Text(prefix.text + " " + content)
  }

  def printText(text: Text): Unit = {
    println(text.content)
  }

  def main(args: Array[String]): Unit = {
    printText("World!")
  }

  // Best to hide this line somewhere below a pile of completely unrelated code.
  // Better yet, import its package from another distant place.
  implicit val prefixLOL = Prefix("Hello")
}
Question

Scala playframework 튜토리얼을 통해 내 길을 찾고 있었고, 나는이 코드 스 니펫을 통해 나를 혼란스럽게 만들었습니다.

def newTask = Action { implicit request =>
taskForm.bindFromRequest.fold(
        errors => BadRequest(views.html.index(Task.all(), errors)),
        label => {
          Task.create(label)
          Redirect(routes.Application.tasks())
        } 
  )
}

그래서 조사를하기로 결정했고이 게시물을 보았습니다 .

나는 아직도 그것을 얻지 않는다.

이 차이점은 무엇입니까?

implicit def double2Int(d : Double) : Int = d.toInt

def double2IntNonImplicit(d : Double) : Int = d.toInt

명백한 사실 이외에 다른 메소드 이름을 가지고있다.

implicit 사용해야하는시기와 이유는 무엇입니까?




또한 위의 경우에는 double => Int 인 암시 적 함수가 only one 있어야합니다. 그렇지 않으면 컴파일러가 혼란스럽고 올바르게 컴파일되지 않습니다.

//this won't compile

implicit def doubleToInt(d: Double) = d.toInt
implicit def doubleToIntSecond(d: Double) = d.toInt
val x: Int = 42.0





Related