Scala 限定导入,如果可能,使用别名
我正在学习Scala,有一个名称中没有点的包:Scala 限定导入,如果可能,使用别名,scala,Scala,我正在学习Scala,有一个名称中没有点的包:test。我现在想将这个包中的东西导入到另一个Scala文件中,但我 不希望使用通配符导入,因为我希望防止名称冲突(因此无导入测试。) 不想导入单个类(因此无导入测试。{My,Manually,maintenanted,List,Of,classes}) 是否希望将test保留为顶级包(因此没有嵌套包。test) 希望将包别名为较短的名称(类似于import{test=>t}) 我一直在玩,但直到现在才成功。我使用scalac a.scala b
test
。我现在想将这个包中的东西导入到另一个Scala文件中,但我
- 不希望使用通配符导入,因为我希望防止名称冲突(因此无
)导入测试。
- 不想导入单个类(因此无
)导入测试。{My,Manually,maintenanted,List,Of,classes}
- 是否希望将
保留为顶级包(因此没有嵌套test
)包。test
- 希望将包别名为较短的名称(类似于
)import{test=>t}
scalac a.scala b.scala编译:
- 文件
a.scala
包测试
A类{}
- 使用文件
b.scala
进行实验,但没有一个有效:
import\u root.{test=>t}//错误:\u root\u无法导入
类扩展了t.A{}
import\u root\u.test//错误:\u root\u无法导入
类扩展test.A{}
导入测试//错误:。预期
类扩展test.A{}
import test.A//警告:导入的'A'被类A的定义永久隐藏
类A扩展了{}//错误:涉及类A的非法循环引用
import{test=>t}//错误:需要标识符,但找到了“{”。
//错误:。应为
类扩展了t.A{}
在python中,我可以像这样实现我想要的
将测试导入为t
甲级(t.A):及格
在哈斯克尔,我可以做到
将合格测试导入为T
A型=T.A型
问题:在Scala中可以实现类似的功能吗?我可以做些什么来接近这个功能?如果
test
是包的完全限定名,您根本不需要导入它。只需使用它:
A类扩展了test.A
更详细一点。在Scala中,只要在编译类路径上存在一个包,它就可以按名称使用。而决定类路径上的内容的是构建工具(或者,如果您使用命令行scalac,我不建议您这样做,但对于最琐碎的实验来说)
Scala中的导入(以及JVM中的大多数语言,如果不是所有其他语言的话)实际上并不是告诉编译器或解释器要使用哪个“模块”,就像在Python中一样。它们的主要目的是允许您使用类和对象的短名称(Foo
,bar
),而不是它们的完全限定名称(org.example.project.Foo
,org.example.project.bar
)
不幸的是,在Scala 2中似乎不可能对
\u root\u
命名空间中的包进行别名处理。在Scala 3import\u root\u中{test=>t}
实际上似乎是可行的。至少在我当前使用的预览快照中是这样。这是可行的,但我相信OP希望将test
重命名为t
。根据他的示例,按原样使用test
似乎是可以接受的,但并不理想。但是重命名test
(理想的做法)目前根本不可能。是的,我明白了,有什么理由不可能。对我来说,这听起来像一个bug,值得报告吗?我不会真的称它为bug,尽管我不确定这是一个疏忽还是故意的。但它可能仍然是一个很好的功能请求。或者只是为了发现它的意图而进行报告al与否。事实证明,这在Scala 3中实际上是可能的,因此,这可能是一种缺陷/疏忽。使用test
作为库名称是一个坏主意。只需发明自己的域名,并将其用作库代码的前缀。作为记录,我。