2011-08-17 12 views
7

Czytam źródła w project i znaleźć taki kod tam:Dlaczego nie ustawić wartość bezpośrednio

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

ja nie rozumiem, dlaczego pisał go w ten sposób, nie jest to ta sama jako:

private var _responded = false 

Jaka jest różnica między nimi?

+2

To zastanawiające. Zastanawiam się, czy ma to coś wspólnego z linearyzacją wielu odziedziczonych cech. –

+1

Bez różnicy, którą znam. Być może dobrym pomysłem byłoby zapytać autora? –

+0

Re: wielokrotne dziedziczenie - podstaw, które nie mogą zostać zmienione. –

Odpowiedz

7

Jestem autorem tego kodu.

Pisząc tak:

private var _responded = false 

przyczyny to ostrzeżenie na kompilacji (ze starszymi wersjami Scala, wydaje żadnego problemu z Scala 2.9):

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

Można Google na temat tego ostrzeżenia znaleźć więcej informacji.

6

Zamierzam tu zaryzykować domysły, ale wygląda to trochę jak kod stworzony przez automatyczną konwertję Java na Scala.

Ten konwerter stara się zachować semantykę oryginalnej Javy tak blisko, jak to tylko możliwe, a więc ma tendencję do tworzenia bardzo nie idiomatycznego kodu, a także wielu zagnieżdżonych zakresów i zmiennych zmiennych.

+0

Czy wiesz, jak semantyka różni się między tymi dwoma (var zainicjalizowany w linii lub w osobnym bloku)? –

+0

W większości przypadków są one takie same. W scenariuszach przychodzących istnieje jednak (wprawdzie niewielkie) ryzyko, że inny wątek będzie czytał niezainicjowaną wartość, gdy deklaracja i przypisanie są wyrażeniami dyskretnymi. –

Powiązane problemy