2011-09-03 2 views
19

스칼라 언어를 사용하려면 인스턴스 변수를 사용하기 전에 인스턴스 변수를 초기화해야합니다. 그러나 Scala는 변수에 기본값을 제공하지 않습니다. 대신 다음과 같이, 당신은 기본값 같은 역할을 와일드 카드 밑줄을 사용하여 수동으로 값을 설정해야스칼라 언어에서 기본값을 사용하는 대신 인스턴스 변수를 초기화해야하는 이유는 무엇입니까?

내가, 내가 알아 ... 내가 클래스 정의의 생성자를 정의 할 수 있습니다 알고
var name:String = _ 

, 이는 파라미터 우리 인스턴스 변수 걸리므 그러나

class Person(var name:String) 

아래와 같이 제가 그 ElementType에 필드 나 메소드 인 자바 주석을 사용할 필요가 있기 때문에 스칼라 제가 몸에서 선언 할 필요가 초기화를 강요하지 않는다; 즉, 클래스의 본문에 선언 된 인스턴스 변수 나 메서드에 적용 할 수 있습니다.

질문 : 스칼라 언어가 인스턴스 변수를 초기화해야하는 이유는 무엇입니까? 기본 값을 사용하지 않고 클래스 본문에 선언 된 _ 또는 원하는 값이 무엇이든간에 인스턴스 변수를 초기화해야하는 이유는 무엇입니까?

+2

마틴의 선호도는 내 추측이 될 것입니다 :-) 적어도 그것은 명시 적이며 여분의 2 문자 (공백을 포함한 4 개)는 대단히 위협적이지 않습니다. 일종의 자바 (매우 자세한 언어)가 생략 된 것을 어리석게 보입니다. 또한, "생성자 인수"(실제로 호출되는 것을 몰라 : -)는 초기화되지 않아도됩니다. 객체가 인스턴스화 될 때가 가장 확실합니다. –

답변

6

은 생성자 인수로 주석을 지정할 때 주석을 적용합니다. 또한 메타 주석을 사용하여 사용중인 주석이 적용되는 대상을 제한해야 할 수도 있습니다. http://www.scala-lang.org/api/2.10.2-RC2/index.html#scala.annotation.meta.package

"기본값에 의존"하는 것에 대한 질문은 다소 불분명합니다. 밑줄을 사용하는 초기화는 변수의 값을 null에 할당하는 것과 일치합니다. 어떤 다른 기본값을 생각하고 있습니까?

+0

밑줄 기호는 기본값을 지정하는 데 사용된다는 것을 압니다. 그러나, 나는 스칼라가 왜 var name : String (밑줄 할당없이)을 클래스 본문에 선언 할 때 허용하지 않는지 알고 싶다. Scala (+1)의 멋진 기능을 내가 알지 못한다는 것을 지적했습니다. 그러나, 내 요구를 충족시키지 않습니다. 왜냐하면 클래스 정의에 선언 된 생성자에서 인스턴스 변수를 선언 할 때 재정의되는 인수가없는 생성자가 필요하기 때문입니다. –

+4

할당이 필요한 이유는 컴파일러가 (추상 메소드의 쌍으로 컴파일되는) 추상 var와 구체적인 클래스를 구별 할 수 있습니다. 또한이 클래스는 클래스 파일에서 필드를 생성해야합니다. –

4

스칼라는 클래스 본문의 "var name : String"과 관련된 문제가 없습니다. 너 해봤 니? 그것은 당신이 원하는 것을 의미하지는 않습니다. 그것은 추상적 인 var입니다. 당신은 당신이 선언은 다음과 같은 코드를 사용하는 경우

abstract class A { 
    var name: String 
} 
// some possible uses for abstract vars 
trait B { type T ; var name: T } 
class B1 extends B { type T = Int ; var name: Int = 5 } 
// hey, no storage 
class B2 extends B { type T = String ; def name = "abc" ; def name_=(x: String) =() } 
+0

방금 ​​var name을 선언하면 : String; .class 파일로 컴파일 될 때 Scala 컴파일러는 다음과 같이 불평 할 것입니다. 변수 이름이 정의되지 않았습니다. 그래서, 왜 디자인 문제 때문에 스칼라가 var name : String을 초기 값을 선언하지 않고 클래스 본문에 사용할 수 없도록했는지 알고 싶습니다. 기본 값이든 뭐든간에 –

+1

내 대답을 다시 읽을 수 있습니다.이 대답은 무시한 것처럼 보입니다. "추상적"이 존재하는 이유를 묻고 있습니까? 구현되지 않은 추상 멤버는 클래스를 인스턴스화 할 수 없다는 것을 의미합니다. 이것은 자바와 마찬가지로 설계된 것입니다. – extempore

18

name 추상적해야한다는 :

class A { 
    var name: String 
} 

난 당신이 이미 알고 가정합니다. 그래서 여러분의 질문은 구문 적 성격의 문제입니다. 대답은 다른 후보와 일치하여 추상 후보자입니다.

는이 같은 일을한다고 가정 :

class A { 
    var variable: String = _ // variable has some default value (probably null) 
    val value: String = _ // value cannot have any default values, since it cannot be reassigned later. 
    def method: String = _ // method could return some default value (probably null) 
    type theType = _ // what should the default type be? (Any perhaps?) 
} 

마지막 세 가지 예제도 컴파일되지 않습니다. 이제 당신은 이런 식으로 뭔가를한다고 가정 :

class A { 
    var variable: String 
    val value: String 
    def method: String 
    type theType 
} 

을 내 관점에서, 거의 스칼라 이해도 누군가가 선언 만 본다. 선언문 이외에 다른 것이 없기 때문에 오해의 여지가 없습니다. 하나의 혼란은 다른 언어에서 왔을 때 약간의 기본값이 있다고 잠시 생각할 때 발생합니다. 그러나 첫 번째 예제 (기본값이있는 예제)를 보자 마자이 혼란이 사라집니다. 그리고 클래스가 추상적 인 계층 구조의 일부 이어야만 추상 멤버를 선언 할 수 있기 때문에 언어를 처음 사용하는 경우에도 컴파일러에서 추가 도움을 얻을 수 있습니다.

귀하의 질문에 행복하게 답변 해 주시기 바랍니다.

+1

답변 해 주셔서 감사합니다 (+1). –

관련 문제