加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

什么时候在Scala中使用隐式参数是有意义的,可以考虑哪些替代scal

发布时间:2020-12-16 09:50:33 所属栏目:安全 来源:网络整理
导读:使用了 Scala库,它大大暴露了对调用者的依赖性,我经历了围绕这种机制的摩擦,因为Scala有时很难调试隐式参数,并且因为有很多地方Scala会填写值来自的隐式参数. (我几乎可以把它当作“暗示地狱”). 在我编码的一次,Scala“抱怨”隐含的值无法匹配,而实际上隐含
使用了 Scala库,它大大暴露了对调用者的依赖性,我经历了围绕这种机制的摩擦,因为Scala有时很难调试隐式参数,并且因为有很多地方Scala会填写值来自的隐式参数. (我几乎可以把它当作“暗示地狱”).

在我编码的一次,Scala“抱怨”隐含的值无法匹配,而实际上隐含值的“碰撞”都来自不同的导入.

无论这种脆弱程度如何,它有时会对滥用背景设计模式感到边缘化.

为什么在Scala中使用隐式参数是有意义的?
在什么情况下你会使用它们,你会如何避免麻烦?

由于我不确定实验曲线和其他团队成员完全混淆的可能性是值得的,您是否可以建议其他scala惯用语来共享多个Scala函数之间的上下文?

这个问题不适用于手头的具体实施,希望它仍然适合这个网站.

解决方法

通常,使用公共类型作为隐式参数是一个坏主意.

def badIdea(n: Int)(implicit s: String) = s * n

想象的原因并不需要太多:如果其他人采用这一政策,你会对同样的事情产生相互矛盾的冲突.最好避免它.

但谁真的想在每次需要时手动填充scala.concurrent.ExecutionContext(实际上到处都是)?

所以关键是:当你有一个特殊类型的东西时,特别是如果它的簿记可能需要手动覆盖,但大多数应该做正确的事情,然后使用隐式参数. (这通常也包括类型类.)

那你真的需要一个字符串怎么办?好吧,包装它(至少正式 – 这里它是一个值类,所以在某些情况下它只会传递字符串):

class MyWrappedString(val underlying: String) extends AnyVal {}
implicit val myString = new MyWrappedString("bird")
def decentIdea(n: Int)(implicit mws: MyWrappedString) = mws.underlying * n

scala> decentIdea(2)  // In the bush?
res14: String = birdbird

或者,如果您认为某些其他逻辑很有用,请编写一个包含额外类型参数的包装器:

class ImplicitWithValue[K,V](val value: V) {
  // Any extra generic logic goes here
}
object ImplicitWithValue {
  class ValuePart[K] {
    def apply[V](v: V) = new ImplicitWithValue[K,V](v)
  }
  private val genericValuePart = new ValuePart[Any]
  private def typedValuePart[K] = genericValuePart.asInstanceOf[ValuePart[K]]
  def apply[K] = typedValuePart[K]
}

然后你可以

trait Marker1
implicit val implicit1 = ImplicitWithValue[Marker1]("fish")

def goodIdea(n: Int)(implicit ms: ImplicitWithValue[Marker1,String]) = ms.value * n

scala> goodIdea(3)
res17: String = fishfishfish

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读