Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么不能在包对象上以速记形式使用apply()?_Scala - Fatal编程技术网

Scala 为什么不能在包对象上以速记形式使用apply()?

Scala 为什么不能在包对象上以速记形式使用apply()?,scala,Scala,在普通对象上,我可以执行以下操作: object A { def apply = "!" } A() // "!" 但在包对象上,这不起作用: package object A { def apply = "?" } A.apply // "?" A() // compile error // error: package A is not a value 有一些基本的限制吗?或者这仅仅是一个实现限制,我可以通过稍微调整编译器来解决吗?不应用的唯一方法是: A.`packag

在普通对象上,我可以执行以下操作:

object A {
  def apply = "!"
}
A() // "!"
但在包对象上,这不起作用:

package object A {
  def apply = "?"
}
A.apply // "?"
A() // compile error
    // error: package A is not a value

有一些基本的限制吗?或者这仅仅是一个实现限制,我可以通过稍微调整编译器来解决吗?

不应用的唯一方法是:

A.`package`()

这是因为
A
不表示值或方法,并且语言规范规定,要使
f()
有效,
f
必须具有方法类型或具有
apply
方法的值类型。我不知道修改编译器有多容易,但我怀疑这是否值得。如果您真的想达到这样的长度,只需将您的方法添加到
Predef

中就更容易了,您想用它做什么?为什么不直接使用普通对象?@SergeyPassichenko——例如,要在整个代码库中调用一些没有导入的方法——如果你有包对象“monkey”和方法“apply”,那么你就可以在任何地方执行“monkey()”。这是一个例子-但我也很感兴趣为什么包对象与普通对象如此不同。我如何才能将方法添加到
Predef
?@Madoc:您可以获得标准库的源代码,添加方法,然后编译它