像这样的代码
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
被初始化为确定的函数值。
答案 0 :(得分:3)
width
这里是closure,可以访问其封闭范围的局部变量。您还可以通过在参数列表中使用val
来为类创建一个完整成员变量的参数,例如class LineElement(val s: String)
。案例类默认使所有参数成员。
这两种语法特性都阻止了其他语言中的常见样板,除了将构造函数参数复制到成员变量之外什么都不做。