作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试着感受implicit
的优势Scala 中的参数。 ( 编辑 :使用匿名函数时的特殊情况。请查看此问题中的链接)
我尝试基于 this 进行简单的模拟邮政。哪里解释了如何Action
工作于 PlayFramework
.这也与that有关.
以下代码用于此目的:
object ImplicitArguments extends App {
implicit val intValue = 1 // this is exiting value to be passed implicitly to everyone who might use it
def fun(block: Int=>String): String = { // we do not use _implicit_ here !
block(2) // ?? how to avoid passing '2' but make use of that would be passed implicitly ?
}
// here we use _implicit_ keyword to make it know that the value should be passed !
val result = fun{ implicit intValue => { // this is my 'block'
intValue.toString // (which is anonymous function)
}
}
println(result) // prints 2
}
implicit
在定义中,但它在那里,因为匿名函数传递了
implicit
.
Action
作品:
object ImplicitArguments extends App {
case class Request(msg:String)
implicit val request = Request("my request")
case class Result(msg:String)
case class Action(result:Result)
object Action {
def apply(block:Request => Result):Action = {
val result = block(...) // what should be here ??
new Action(result)
}
}
val action = Action { implicit request =>
Result("Got request [" + request + "]")
}
println(action)
}
最佳答案
隐式不会像这样工作。没有魔法。它们只是(通常)隐藏的参数,因此在调用函数时会被解析。
有两种方法可以使您的代码工作。
您可以修复 fun
的所有调用的隐含值
def fun(block: Int=>String): String = {
block(implicitly[Int])
}
implicitly
是在 Predef 中定义的函数。再次没有魔法。这是它的定义
def implicitly[A](implicit value: A) = value
fun
而不是每次调用。
def fun(block: Int=>String)(implicit value: Int): String = {
block(value)
}
val result = fun{ _.toString }(3)
"3"
因为显式
3
在末尾。然而,没有办法神奇地改变
fun
从您的声明中获取隐式作用域中的值。
关于Scala 隐式参数通过传递一个函数作为参数来感受adnvatage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18854829/
我是一名优秀的程序员,十分优秀!