作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
显然,提取器对象中的 unapply/unapplySeq 不支持隐式参数。假设这里有一个有趣的参数 a 和一个令人不安的普遍存在的参数 b,在提取 c 时可以很好地隐藏它。
[ 编辑 ]:在我的 intellij/scala-plugin 安装中似乎有什么问题导致了这个问题。我无法解释。最近我的智能遇到了许多奇怪的问题。重新安装后,我无法再重现我的问题。确认 unapply/unapplySeq 确实允许隐式参数!谢谢你的帮助。
这不起作用(**编辑 :是的,确实如此):**
trait A; trait C; trait B { def getC(a: A): C }
def unapply(a:A)(implicit b:B):Option[C] = Option(b.getC(a))
object A1{
def unapply(a:(A,B)):Option[C] = Option(a._2.getC(a._1)) }
val c1 = (a,b) match { case A1(c) => c1 }
class BDependent(b:B){
object A2{
def unapply(a:A):Option[C] = Option(b.getC(a))
} }
val bDeps = new BDependent(someB)
import bDeps.A2
val a:A = ...
val c2 = a match { case A2(c) => c }
}
object A4{
def unapply[A,C](a:A):Option[B => C] = Option((_:B).getC(a))
}
val b:B = ...
val soonAC: B => C = a match { case A4(x) => x }
val d = soonAC(b).getD ...
最佳答案
你的第一行代码在什么意义上不起作用?对于提取器方法的隐式参数列表,当然没有任意禁止。
考虑以下设置(我使用普通的旧类而不是案例类来表明这里没有发生额外的魔法):
class A(val i: Int)
class C(val x: String)
class B(pre: String) { def getC(a: A) = new C(pre + a.i.toString) }
B
值并使用您的
unapply
创建一个提取器对象方法:
implicit val b = new B("prefix: ")
object D {
def unapply(a: A)(implicit b: B): Option[C] = Option(b getC a)
}
scala> val D(c) = new A(42)
c: C = C@52394fb3
scala> c.x
res0: String = prefix: 42
关于scala - 隐式参数不适用于 unapply。如何从提取器中隐藏无处不在的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12338469/
我是一名优秀的程序员,十分优秀!