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

Scala:在某个包的所有子包中导入隐式转换

发布时间:2020-12-16 18:35:36 所属栏目:安全 来源:网络整理
导读:我在对象中定义了隐式转换.让我们调用对象Implicits,其中有一个隐式转换. package com.gmail.naetmul.stackoverflow.appobject Implicits { implicit def int_to_intEx(x: Int): IntEx = IntEx(x)} 这个对象在某个包中.我想在com.gmail.naetmul.stackoverflo
我在对象中定义了隐式转换.让我们调用对象Implicits,其中有一个隐式转换.

package com.gmail.naetmul.stackoverflow.app

object Implicits {
  implicit def int_to_intEx(x: Int): IntEx = IntEx(x)
}

这个对象在某个包中.我想在com.gmail.naetmul.stackoverflow.app包及其所有子包中的每个代码中使用这种隐式转换,例如com.gmail.naetmul.stackoverflow.app.something.anything.everything.

所以我创建了com.gmail.naetmul.stackoverflow.app的包对象.

package com.gmail.naetmul.stackoverflow

package object app {
  import com.gmail.naetmul.stackoverflow.app.Implicits._
}

但它不能在确切的包对象之外工作.
所以我将对象Implicits更改为trait并让包对象扩展它.

package com.gmail.naetmul.stackoverflow.app

trait Implicits {
  implicit def int_to_intEx(x: Int): IntEx = IntEx(x)
}
package com.gmail.naetmul.stackoverflow

import com.gmail.naetmul.stackoverflow.app.Implicits

package object app extends Implicits {
  // some code
}

隐式转换在com.gmail.naetmul.stackoverflow.app包中有效.但是,它在子包中工作或不工作.

例如)

文件A.scala

package com.gmail.naetmul.stackoverflow.app.database

class A {
  // Here,the implicit conversion did NOT work.
}

文件B.scala

package com.gmail.naetmul.stackoverflow.app
package database

class B {
  // Here,the implicit conversion DID work.
}

所以问题是:

>在这种情况下,我应该使用trait而不是object(使用包对象,但在外面定义)?
>是否有另一种方法可以在子包中使用隐式转换?
我的意思是,只导入一次,并在任何地方使用它们.在B.scala中工作的方式似乎很好,但Eclipse的默认包语句就像A.scala,所以我必须手动更改它们.

解决方法

对于问题1,将超类中的含义隐藏为“LowPriorityImplicits”会很有用,但这似乎不是这里的用例.

对于问题2,嵌套包是将implicits纳入范围的常用方法. “packagings”中的规范9.2使用了一个神奇的短语,“在他们的简单名称下可见”.

但是有一些利用隐式范围的策略.

我想从你的部分例子中猜测你想用像奇数这样的方法来增强Int.对于此用例,提供缺少的成员,您必须提供已完成的转换.

但API设计还有其他选择.例如:

给定API:

package goofy

object API { 
  def api(i: IntEx) = i.odd
}

以及子包中API的客户端:

package goofy.foo.bar.baz

import org.junit.Test

class UseIntExTest {
  import goofy.API._
  @Test def usage(): Unit = {
    assert(api(3))
  }
}

在哪里导入API并获得“免费”的隐式范围.

转换位于伴随对象中:

package goofy

class IntEx(val i: Int) {
  def even = i % 2 == 0
  def odd  = !even
}

object IntEx {
  implicit private[goofy] def `enhanced IntEx`(i: Int): IntEx = new IntEx(i)
}

这是有效的,因为IntEx是一种预期的类型.您也可以以相同的方式利用类型参数.

为了完整性,要显示转换受限于子包:

package roofy

import org.junit.Test 

class BadUsageTest {
  import goofy.API._
  @Test def usage(): Unit = {
    //assert(api(3))  // DNC
  }
}

(编辑:李大同)

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

    推荐文章
      热点阅读