我编写了一个Scala类Sheltie来了解范围在Scala中的工作方式.我写了一个等效的Java Sheltie类作为交叉引用.这是我遇到麻烦的地方.
在Scala Sheltie类的主体中,有一个对调用方法的方法调用bark和调用println之后的语句bark.一个等效的方法调用bark()可以放在另一个方法中的等效Java类中,但在任何方法之外,它都可以理解Duplicate method bark().
我理解Java代码是如何工作的,所以这种行为(在Java中)并不令人惊讶.令人困惑的是Scala的行为方式.
我希望解决的是:为什么Scala允许类体中的"调用"以及为什么它允许在if块中创建另一个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中.
在Scala中,"类体"中的语句(不包括声明)作为默认构造函数的一部分执行.在实例化类的对象时,您将能够观察到这一点Sheltie.其他构造函数在Scala 中称为辅助构造函数.
class Test(a: Int) {
  println("a = " + a)
}
new Test(1) /* Prints a = 1 */
关于变量阴影,实际上没有正确或错误的事情要做.Scala允许您隐藏变量,其他语言则不允许.我的猜测是它是允许的,因为以函数式编程通常会导致很多局部变量存在于非常有限的范围内,例如,来自闭包声明.
| 归档时间: | 
 | 
| 查看次数: | 157 次 | 
| 最近记录: |