2011-08-17 40 views
7

Tôi đang đọc nguồn gốc của một project, và tìm thấy mã như vậy đó:Tại sao không thiết lập giá trị trực tiếp

private var _responded: Boolean = _ 
{ 
    _responded = false 
} 

Tôi không hiểu tại sao ông đã viết nó như thế này, không phải là nó giống nhau như:

private var _responded = false 

Sự khác nhau giữa chúng là gì?

+2

Điều đó thật khó hiểu. Tôi tự hỏi nếu nó có một cái gì đó để làm với linearization của nhiều đặc điểm thừa kế. –

+1

Không có sự khác biệt mà tôi biết. Có lẽ nó sẽ là một ý tưởng tốt để hỏi tác giả? –

+0

Re: multiple inheritence - scratch rằng, vars không thể bị ghi đè. –

Trả lời

7

Tôi là tác giả của mã đó.

Viết như thế này:

private var _responded = false 

nguyên nhân cảnh báo này trên biên soạn (với phiên bản cũ của Scala, dường như không có vấn đề với Scala 2.9):

the initialization is no longer be executed before the superclass is called 

Bạn có thể google về cảnh báo rằng để tìm thêm thông tin.

6

Tôi sẽ gây nguy hiểm cho dự đoán ở đây, nhưng trông giống như mã được tạo bởi Java tự động chuyển đổi Scala của intellij.

Công cụ chuyển đổi này cố gắng duy trì ngữ nghĩa của Java gốc càng gần càng tốt, và do đó có xu hướng tạo ra mã không phải là thành ngữ, cũng như nhiều phạm vi lồng nhau và các biến có thể thay đổi.

+0

Bạn có biết ngữ nghĩa khác nhau giữa hai (var khởi tạo nội tuyến hay trong một khối riêng) không? –

+0

Đối với hầu hết các ý định và mục đích chúng giống nhau. Tuy nhiên, trong các kịch bản đến, có một rủi ro (thừa nhận nhỏ) của một luồng khác đọc giá trị uninitialised khi khai báo và gán là các câu lệnh rời rạc. –

Các vấn đề liên quan