2010-08-16 15 views
1

Scalacheck 라이브러리를 사용하여 응용 프로그램을 테스트하고 있습니다. 이 라이브러리에는 어떤 객체와 그 클래스의 객체 생성자에 대한 암시 적 변환을 정의하는 Gen 객체가 있습니다. 이 예에서 implicits의 이상한 동작

scala> import org.scalacheck.Gen._ 
import org.scalacheck.Gen._ 

scala> "foo" sample 
res1: Option[java.lang.String] = Some(foo) 

는 암시 Gen.value()"foo"에 적용, 즉 항상 발전기를 산출 :

예는, Gen._ 수입하면 Gen로의 암시 적 변환을 통해, 모든 객체에 같은 sample 등의 메소드를 호출 할 수 있습니다 Some(foo)을 반환합니다.

하지만이 작동하지 않습니다

scala> import org.scalacheck.Gen.value 
import org.scalacheck.Gen.value 

scala> "foo" sample     
<console>:5: error: value sample is not a member of java.lang.String 
     "foo" sample 
      ^

을 왜? 내가 스칼라 2.7.7final 및 ScalaCheck 2.7.7-1.6을 사용하고

업데이트

.

업데이트

그냥 ScalaCheck 2.8.0-1.7와 스칼라 2.8.0.final로 전환. 문제는 실제로 사라졌습니다.

답변

3

난 그냥 스칼라 2.8.0.final로 이것을 시도했고 ScalaCheck 1.7은 같은 것을 위해 만들었습니다.

scala> "foo" sample 
res1: Option[java.lang.String] = Some(foo) 

당신은 스칼라와 ScalaCheck의 어떤 버전을 사용 했 : 모두 수입은 모두 수입에 대한 두 번째 라인 생산 원하는 결과를 의미했다?

+0

저는 Scala 2.7.7final과 ScalaCheck 2.7.7-1.6을 사용하고 있습니다. 이 버전의 버그입니까? 업그레이드해야합니까? – lindelof

+0

2.7.7 제한 일 수 있지만 2.8로 업그레이드하는 것은 큰 단계이므로 준비가되었을 때만 수행하십시오. –

+0

@lindelof : 2.7은 막 다른 길이며 유지 관리되지 않습니다. 2.8 ASAP로 업그레이드하는 것이 좋습니다. 생각만큼 큰 일은 아닙니다. –

0

단순 : 암시 적 변환을 가져 오지 않았습니다. 이름이 무엇이든간에 value이라는 항목을 org.scalacheck.Gen 개체로 가져 왔습니다.

정정/정화 :

Gen.value (즉하지 trait Gen[+T], object Gen 'S) trait Gen[T]은 (TGen.Params의 인수로하는 함수이다 (실시 익명 클래스)의 인스턴스에 임의의 값을 포장하는 데 사용 내재적 인 어느 것에 Gen.value가 적용됩니다). Gen.sampletrait Gen[T]의 메서드로, 합성 값을 얻기 위해 해당 (콘크리트 Gen 하위 클래스) apply 메서드를 호출합니다.

슬프게도 더 가까이에서 보았을 때 object Gen의 나머지 구성원을 가져올 때 코드가 작동하지 않는 이유를 모르겠다는 것을 인정해야합니다.