2014-07-24 5 views
2

"상수"값을 고려하십시오 : DefaultEncoding. 일반적으로 우리는 동반자 객체에 추가합니다 : STRLEN 코드 구조에 해당하는 경우 클래스로 필요하기 때문에사례 클래스의 "상수"값

object Strlen { 
    val DefaultEncoding = "ISO-8859-1" 
    .. 
} 

그러나, 우리는 동반자 객체의 사용을 피하기 위해 강요/상당의 규칙은 기존의 코드베이스 :

case class Strlen(child: Expression, encoding : Expression) extends UnaryExpression with LengthExpression { 

    val DefaultEncoding = "ISO-8859-1" // This will not be isible in the following constructor 

    def this(child: Expression) = this(child, new Literal(DefaultEncoding, StringType)) 

그런 다음 사례 클래스 내에서 DefaultEncoding '상수'의 구획화를 달성 할 수있는 방법이 있습니까?

데프 DefaultEncoding = "ISO-8859-1"

그러나이

[info] Compiling 1 Scala source to /shared/spark-master/sql/catalyst/target/scala-2.10/classes... 
[error] /shared/spark-master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringOperations.scala:253: not found: value DefaultEncoding 
[error] def this(child: Expression) = this(child, new Literal(/* StrConstants. */DefaultEncoding, StringType)) 
[error]  
+0

케이스 클래스 안에 상수를 넣을 수 없다. 이름은 실제로 낙타의 경우 'defaultEncoding'보다 낮아야한다. – samthebest

+0

@ samthebest 네, 저는이 두 가지를 모두 알고 있습니다 - 이것이이 질문의 요점이었습니다. 문제를 해결하는 방법을 알려주십시오. – javadba

답변

3
를 컴파일되지 않습니다 : wingedsubmariner에 의해 제안에서

업데이트, 나는 케이스 클래스 내에서 다음과 같은 시도

케이스 클래스와 함께 컴패니언 개체를 사용할 수 있습니다. 동일한 컴파일 유닛 (대개 동일한 파일)에 같은 이름의 객체를 선언하면 대/소문자 클래스의 컴패니언 객체로 취급되며 대개의 대소 문자 클래스 도우미 객체 메소드가 있습니다. unapply가 추가되었습니다.

다른 옵션은 DefaultEncodingdef으로 선언하는 것입니다. 필드 액세스는 Scala의 접근자를 통해 항상 수행되기 때문에 성능상의 불이익은 없습니다.

+0

사례 클래스 기본 도우미 개체와 함께 제공되는 제품 인터페이스 구현이 필요하므로 첫 번째 제안이 이상적이지 않습니다. 나는 그 자신을 일반적인 규칙으로 코딩하고 싶지 않다. 나는 지금 제안 제안을 시도하고있다. – javadba

+0

Pls 업데이트 된 내용보기 – javadba

+0

@Utaal에 따르면 제품 인터페이스는 어쨌든 작동합니다. 고마워, 나는 오늘 아침 총에 맞았지만 확인하기 위해 다시 올 것이다. 그 동안 upvoted. – javadba

2

case class에 대한 사용자 지정 컴패니언 개체를 작성해도 컴파일러가 사례 클래스에 대한 기본 도우미 메서드를 제공하지 못하는 것은 아닙니다.

trait Expression 
trait UnaryExpression extends Expression 
trait LengthExpression extends Expression 

trait Typ 
case object StringType extends Typ 

case class Literal(val encoding: String, val typ: Typ) extends Expression 

case class StrLen(child: Expression, encoding: Expression) extends UnaryExpression with LengthExpression { 
    def this(child: Expression) = this(child, new Literal(StrLen.DefaultEncoding, StringType)) 
} 

object StrLen { 
    val DefaultEncoding = "ISO-8859-1" 
    def apply(child: Expression): StrLen = apply(child, new Literal(StrLen.DefaultEncoding, StringType)) 
} 

case object ExampleExpression extends Expression 

println(StrLen(ExampleExpression)) 
// --> StrLen(ExampleExpression,Literal(ISO-8859-1,StringType)) 
println(new StrLen(ExampleExpression)) 
// --> StrLen(ExampleExpression,Literal(ISO-8859-1,StringType)) 
def isProduct[T <: Product] {} 
isProduct[StrLen] 

기본 apply 여전히 컴파일러가 제공하는 (그리고 def apply(child: Expression에 사용)되어, StrLen는 여전히 Product를 확장하고 toString는 여전히 옳은 일을한다. def this(child: Expression) 사용자 지정 생성자는 아마도 단일 매개 변수 apply을 사용할 수 있으므로 필요하지 않습니다.

+0

고마워요, 저는 오늘 아침 총에 맞았습니다.하지만 확인을 위해 다시 올 것입니다. 그 동안 upvoted. – javadba

+0

실제로 사용자 지정 컴패니언 개체를 작성하면 컴파일러에서 더 이상 추가하지 않는 기본 도우미 메서드가 실제로 제거됩니다. 이 질문보기 : https://stackoverflow.com/q/25392422/935676 – amoebe

관련 문제