Tôi đang chơi đùa với Scala. Và tôi đã tìm thấy 3 điều thú vị (tiêu đề là phần thứ ba).Tại sao trình biên dịch Scala cho .NET bỏ qua ý nghĩa của val?
1 biến cục bộ được khai báo là val không được hiểu là cuối cùng.
class HowAreVarAndValImplementedInScala {
var v1 = 123
val v2 = 456
def method1() = {
var v3 = 123
val v4 = 456
println(v3 + v4)
}
}
nếu tôi biên dịch mã scala trên vào bytecode và sau đó dịch ngược đó vào java, nó trông như thế này:
public class HowAreVarAndValImplementedInScala
{
private int v1 = 123;
private final int v2 = 456;
public int v1()
{
return this.v1;
}
public void v1_$eq(int x$1) { this.v1 = x$1; }
public int v2() { return this.v2; }
public void method1() {
int v3 = 123;
int v4 = 456;
Predef..MODULE$.println(BoxesRunTime.boxToInteger(v3 + v4));
}
}
chúng ta có thể thấy v2 là cuối cùng, nhưng không phải là v4, tại sao?
biên dịch 2 scala cho .net thêm ghi đè từ khóa để rất nhiều (nếu không phải tất cả) các phương pháp dụ công
nếu chúng ta biên dịch mã scala hiển thị ở trên vào CIL và sau đó dịch ngược nó vào C#, nó là như thế này:
public class HowAreVarAndValImplementedInScala : ScalaObject
{
private int v1;
private int v2;
public override int v1()
{
return this.v1;
}
public override void v1_$eq(int x$1)
{
this.v1 = x$1;
}
public override int v2()
{
return this.v2;
}
public override void method1()
{
int v3 = 123;
int v4 = 456;
Predef$.MODULE$.println(v3 + v4);
}
public HowAreVarAndValImplementedInScala()
{
this.v1 = 123;
this.v2 = 456;
}
}
tất cả phương pháp công khai (không bao gồm hàm tạo) được đánh dấu là ghi đè, tại sao? là cần thiết?
3 trình biên dịch Scala cho .net thua ý nghĩa của val
trong C# mã trên, chúng ta có thể thấy v2 đó chỉ là một lĩnh vực bình thường, trong khi ở phần java couter, v2 được đánh dấu là cuối cùng, shouldn 't v2 được đánh dấu là chỉ đọc bởi trình biên dịch Scala cho .net? (một lỗi?)
Theo như tôi biết, 'final' không có ý nghĩa thời gian chạy trong các biến cục bộ nhưng chỉ nhấn mạnh rằng * bạn sẽ không thay đổi giá trị *. 'cuối cùng' lĩnh vực trong tương phản ngụ ý ví dụ rằng họ đang khởi tạo sau khi constructor đã được thực hiện. Do đó, tôi giả sử ** nó bị bỏ qua cho 'v4' vì nó không liên quan đến máy tính, trong khi' v2' phải là 'final' trong Java. Tôi không chắc chắn đủ để làm cho câu trả lời này, tuy nhiên. –
3 câu hỏi phải là 3 câu hỏi ... –
@MatthiasMeid có, có vẻ như đúng – CuiPengFei