我编写了一个 Scala 类 Sheltie
来了解作用域在 Scala 中的工作原理。我写了一个等效的 Java Sheltie 类作为交叉引用。这是我遇到麻烦的地方。
在 Scala Sheltie
类的主体中,有一个调用名为 bark
的方法的方法,紧接着有一个 println
语句吠叫
调用。等效方法调用 bark()
可以放在另一个方法内的等效 Java 类中,但在任何方法之外,它会提示 Duplicate method bark()
是可以理解的。
我了解 Java 代码的工作原理,因此这种行为(在 Java 中)并不奇怪。令人困惑的是 Scala 的行为方式为何如此。
我希望解决的是:为什么 Scala 允许在类主体中进行“调用”,为什么它允许在 if block 中创建另一个 val 定义,而 Java 却不允许。
Foo.scala
class Sheltie {
val barkNum = 10
def bark() {
//local barkNum of "bark" method
val barkNum = 20
if(true){
//local "barkNum" of if-block
val barkNum = 30 //why does Scala not complain of a duplicate local variable, when Java does in the equivalent program Sheltie.java
println("Inside if block: No of times Riley barked is " + barkNum)
}
println("Outside if block: No of times Riley barked is " + barkNum)
}
bark //Why does this work, when you can't do this in Java
println("Outside bark: No of times Riley barked is " + barkNum)
}
最佳答案
当你在类主体中说 Scala 允许调用时,主体实际上是构造函数,所以这等同于:
public Sheltie()
{
bark();
System.out.println("Outside bark: No of times Riley barked is " + barkNum);
}
在 Java 中。
关于java - 演示嵌套作用域的 Scala 代码在 Java 中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11619784/