Scala使用参数传递给对象的其他方法构造对象

时间:2018-01-04 13:11:48

标签: scala functional-programming

像这样的代码

  object Ex10  {
  abstract class Element {
    def contents: Array[String]
    def height: Int = contents.length
    def width: Int = if (height == 0) 0 else contents(0).length

    def above(that: Element): Element =
      new ArrayElement(this.contents ++ that.contents)

    def beside(that: Element): Element = {
      val contents = new Array[String](this.contents.length)
      for (i <- 0 until this.contents.length)
        contents(i) = this.contents(i) + that.contents(i)
      new ArrayElement(contents)
    }

    def beside2(that: Element): Element =
      new ArrayElement(
        for (
          (line1, line2) <- this.contents zip that.contents
        ) yield line1 + line2
      )

    override def toString = contents mkString "\n"

  }

  class LineElement(s: String) extends Element {
    **var contents = Array(s)
    override def width = s.length
    def w = contents(0).length
    override def height = 1**
    def change_contents(source: String) :Unit = {this.contents = Array(source)}
  }

  class ArrayElement(conts: Array[String]) extends Element {
    def contents: Array[String] = conts
  }

  def main(args: Array[String]) {
    val lineElem = new LineElement("foo")
    println(lineElem.w)
    println(lineElem.width)
    lineElem.change_contents("abcd")
    println(lineElem.w)
    println(lineElem.width)
    println("lineElem [" + lineElem + "]")
  }
}

结果:  3  3  4  3  lineElem [abcd]

在Scala编程书中,我对这行override def width = s.length感到困惑,这是一个在调用时会使用的方法。但是构造的参数s应该是无效的,或者用C ++语言释放它是一个局部变量。 实施例

#include <iostream>

using namespace std;

class A{
    public:
        A(int a){b = a;}
        int b;
        int f() {cout << a;}
}

int main()
{
    A a = new A();
    a.f()
    cout<<"Hello World";

    return 0;
} 

我还调试了scala代码,发现两个字段&#39; (s和内容)value = {char [3] @ 846},这可能意味着它们指向相同的内存地址。

任何人都可以解释在scala中传递的参数是值传递或传递引用,为什么scala像存储传递给构造对象的参数一样?

这不是两种语言之间的差异比较&#39;语法。我想知道这种用法的原理。

任何帮助将不胜感激,谢谢。

通过结果,s.length为3.我猜测在对象构造期间def height: Int = s.length被初始化为确定的函数值。

1 个答案:

答案 0 :(得分:3)

width这里是closure,可以访问其封闭范围的局部变量。您还可以通过在参数列表中使用val来为类创建一个完整成员变量的参数,例如class LineElement(val s: String)。案例类默认使所有参数成员。

这两种语法特性都阻止了其他语言中的常见样板,除了将构造函数参数复制到成员变量之外什么都不做。