2014-10-12 4 views
0

저는 Coursera 과정에서 스칼라의 Functional Programming을 사용하고 있습니다. 문제에 대한 해결책을 제공하는 것에 대한 자질이 있다면, 이것은 과제와 직접 관련이 없습니다.실제와 일치하는 것으로 보이지만 스칼라 테스트에 실패합니다.

나는 무슨 일이 일어나고 있는지 자주 알지 못한다. 따라서 통찰력을 얻기 위해 테스트를 사용합니다. 이번주의 과제에는 일련의 테스트가 포함되어 있습니다. 테스트 세트에는 size와 asSet이라는 몇 가지 함수가 정의되어 있으며, 후자는 TweetSet을 Set [Tweet]으로 변환합니다. 나는 둘 다에 대한 테스트를 만들었습니다. 크기 테스트는 잘 작동합니다. asSet은 빈 세트에 대해 작동하지만 하나의 요소 세트로 실패합니다. 출력 메시지는 내가 한 일이 옳은 것처럼 보이게하므로, 현재 무엇이 잘못되었는지 전혀 모른다.

결과 메시지는 다음과 같습니다

org.scalatest.exceptions.TestFailedException: Set(User: a 
Text: a body [20]) did not equal Set(User: a 
Text: a body [20]) 

당신이 볼 수 있듯이, 그것은 결과가 기대와 동일한 상태. 여기서, 실패한 테스트는 다음 함수가 (이것은 교재 제공되었다)는 다음과 같이 정의된다

test("asSet: on singleton set") { 
    new TestSets { 
     assert(asSet(set2) === Set[Tweet](new Tweet("a", "a body", 20))) 
    } 
    } 

:

def asSet(tweets: TweetSet): Set[Tweet] = { 
    var res = Set[Tweet]() 
    tweets.foreach(res += _) 
    res 
    } 

(단, 다시) 다음 SET2의 정의 :

다음
val set1 = new Empty 
val set2 = set1.incl(new Tweet("a", "a body", 20)) 

트윗 정의된다

class Tweet(val user: String, val text: String, val retweets: Int) { 
    override def toString: String = 
    "User: " + user + "\n" + 
    "Text: " + text + " [" + retweets + "]" 
} 

내가 통과해야하는 것처럼 보이지만이 테스트가 실패하는 것과 같이 나는 무엇을 놓치고 있습니까?

+0

확인을 만들어 믿습니다. 같지 않은 경우 동일한 데이터가 포함되어 있어도 equals와 toHascode가 다른 방식으로 구현되므로 서로 다를 수 있습니다. –

+0

Tweet의 정의가 추가되었습니다. 나는 케이스 클래스의 정의를 찾아 봐야했다. 내가 이해할 때, 당신은 수퍼 클래스 (abstract?)와 case 키워드를 사용하여 수퍼 클래스를 확장하는 여러 클래스를가집니다. 트윗은 아무 것도 확장하지 않으며 case 키워드를 사용하지 않습니다. –

답변

0

hashCode이 구현되어 테스트가 실패합니다.

  • 는 스칼라가 사용하는 모든 클래스에 구현 방법과 동일 ==로 비교합니다. 인스턴스 (instance)가 설정 또는 사용하는 포함되는 경우 키 스칼라가 해시 코드 방법

하여 오류의 기본 소스를 구현 한 것처럼 트윗 모든 인스턴스를 사용하기 때문에

  • 을 확인하려면 동일한 정보가 포함되어 있더라도 다른 것입니다.

    scala> val x= Set(new Tweet("me", "test message", 1),new Tweet("me", "test message", 1)) 
        x: scala.collection.immutable.Set[Tweet] = 
        Set(User: me 
         Text: test message [1 ], 
         User: me 
         Text: test message [1 ]) 
    
    scala> x.size 
    res3: Int = 2 
    

    이 메소드의 구현 방법은 클래스 및 사례 클래스에 따라 다릅니다.케이스 클래스와 일반 클래스

    class Tweet(val user: String, val text: String, val retweets: Int) { 
        override def toString: String = 
        s"""User: $user 
        |Text: $text [$retweets ]""".stripMargin 
    } 
    
    
    
    scala> val x = new Tweet("me", "test message", 1) 
    x: Tweet = 
        User: me 
        Text: test message [1 ] 
    
    scala> x == x 
    res0: Boolean = true 
    
    scala> x == new Tweet("me", "test message", 1) 
    res1: Boolean = false 
    

    case class Tweet(val user: String, val text: String, val retweets: Int) { 
        override def toString: String = 
        s"""User: $user 
         |Text: $text [$retweets ]""".stripMargin 
    } 
    
    scala> val x = new Tweet("me", "test message", 1) 
    x: Tweet = 
        User: me 
        Text: test message [1 ] 
    
    scala> x == x 
    res2: Boolean = true 
    
    scala> x == new Tweet("me", "test message", 1) 
    res3: Boolean = true 
    
    scala> (new Tweet("me", "test message", 1)).hashCode 
    res6: Int = -1967705983 
    
    scala> (new Tweet("me", "test message", 1)).hashCode 
    res7: Int = -1967705983 
    
  • 0

    나는 당신의 문제가 할당에 수동 구현을 개발하고 있다고 믿는다의, 반면에 Scala의 내부 Set 유형을 사용하여 비교했습니다. 즉, 서로 다른 유형의 두 인스턴스를 비교하는 것입니다.

    나는 트윗이 경우 클래스의 경우이 라인의 오른쪽은 scala.collection.immutable.Set

    assert(asSet(set2) === Set[Tweet](new Tweet("a", "a body", 20))) 
    
    관련 문제