Scala 为什么将包级别的defs/types/implicits放在文件的根级别是非法的?
自从我开始使用Scala以来,这个问题一直困扰着我。这是我的想法:Scala 为什么将包级别的defs/types/implicits放在文件的根级别是非法的?,scala,packages,Scala,Packages,自从我开始使用Scala以来,这个问题一直困扰着我。这是我的想法: Scala没有Java的要求,一切都必须在一个类中,这是一件好事 Scala有函数,即没有类/对象的方法 包是对象,因此如果在包中定义类,它将进入包对象 有些东西必须显式地放入包对象中,而有些东西没有-为什么? 我觉得不得不写这样的东西太难看了: package foo.bar object `package` { type Foo = Bar def fact(n: Int): Int = ??? } 而不仅仅是
package foo.bar
object `package` {
type Foo = Bar
def fact(n: Int): Int = ???
}
而不仅仅是
package foo.bar
type Foo = Bar
def fact(n: Int): Int = ???
那么:有人知道什么时候/为什么决定使用包对象进行显式包装更好吗?我经常发现自己对晦涩难懂的对象包
声明引入的额外缩进和样板文件感到恼火,这与Java中的恼人原因相同:
class MyMath {
public static int fact(int n) { ... }
}
不知道真正的原因,但包对象语法鼓励您将所有定义(记住,它们将在包范围内可见)保留在一个位置(而不是分散在整个代码库中)@om nom nom:但这并不完全正确:如果您愿意,您可以在同一个包中让类分散在1000个文件周围。假设我定义函数
x
,我可以在类(文件)MyClass1或MyClass2或。。。或MyClassN,全部放在foo.bar
包中,此函数x
将在foo.bar
中随处可见。。。没有地方——现在很难找到它的定义位置(是的,我知道我们有grep、IDE等等)。不要收到关于类的最后一条评论。@om nom nom:您可以从任意多个.scala
文件中将类定义到package foo
;此外,没有强制执行每个文件一个类的约定,也没有强制执行文件名应与类名相同的约定,那么为什么我们突然强制将def
s、type
s和implicit
s放在一个位置?此外,packagefoo.bar
的package对象的“一个位置”可以是x123\u hello.scala
在一个名为i/love/bacon
的文件夹中,不管怎样,说到可查找性。