pdi*_*lag 7 java scala jvm-languages
在Java,Scala或通常任何JVM语言中,默认情况下会导入一组包.例如,Java会自动导入java.lang,您不需要在Java代码文件中执行此操作.
现在我不知道哪个组件完全处理这个问题(编译器?JVM?),但有没有办法在默认情况下导入其他包甚至类?
假设你有一个包定义了你在整个项目中使用的一组实用函数(一个例子可能scala.math在Scala中),如果你能够在每个数学相关的类中跳过它的导入,那就太好了.
Jim*_*ter 12
从2.8开始,Scala具有包对象,其内容自动导入到包的每个文件中.在包的顶级目录中创建一个名为package.scala的文件(例如x/y/z/mypackage),并将其放入其中
package x.y.z
package object mypackage {
...
}
Run Code Online (Sandbox Code Playgroud)
然后,包对象中的任何定义都会被自动导入(即,不需要import语句)到包xyzmypackage中的任何文件中
您可以查看Scala源代码 - 执行查找dir -name package.scala - 其中有一大堆,最顶层定义scala包本身的隐式导入,这些导入会自动导入到每个scala源文件中.
Von*_*onC 11
Jim Balter在他的回答中提到了Scala 2.8 包对象.
您可以将任何类型的定义放在类中,也可以放在包的顶层.如果您有一些帮助方法,您希望在整个软件包的范围内,请继续将其放在软件包的顶层.
为此,请将定义放在包对象中.每个包都允许有一个包对象
Scala实际上有自己的scala包对象.
请参阅" 放置包对象的位置 ".
因此,package对象可以解决给定包的显式导入问题,但不能解决任何包的问题.
它目前的限制包括:
- 首先,您无法在包对象中定义或继承重载方法.
- 其次,您无法在包对象中定义或继承成员,该对象也是同一包中的顶级类或对象的名称.
我们预计未来一些Scala版本将放弃这些限制.
原始答案:
在Scala方面,像" scala导入scala.collection.JavaConversions._默认情况下? "这样的问题表明你不能只是将默认导入作为Scala用户添加.
它必须得到语言的支持.
顺便说一句,结论是:
从Scala专家的角度来看:让我们保持简单,并将默认导入的含义限制为绝对最小值.
Heiko Seeberger
拉斐尔确实发表评论:
我想你可以编写自己的编译器插件来添加一些包吗?
当然,这篇Scala文章描述了如何扩展Scala编译器.
但支持的主要增加是:
- 您可以向编译器添加阶段,从而添加额外的检查或在类型检查完成后应用的额外树重写.
- 您可以告诉编译器类型检查有关要应用于类型的注释的信息.
因此,即使使用树重写(包括其他导入),我也不确定是否可以及时完成重写,因为可以正确分析类型和函数(由您要求的隐式导入引用).
但也许Scala Compiler Corner对此有更多的想法.
| 归档时间: |
|
| 查看次数: |
2457 次 |
| 最近记录: |