Странное поведение с последствиями - PullRequest
1 голос
/ 17 августа 2010

Я использую библиотеку Scalacheck для тестирования своего приложения. В этой библиотеке есть объект Gen, который определяет неявные преобразования любого объекта в генератор объектов этого класса.

Например, импорт Gen._ позволяет вам вызывать такие методы, как sample для любого объекта, посредством неявного преобразования в Gen:

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

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

В этом примере неявный Gen.value() применяется к "foo", давая генератор, который всегда возвращает 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
             ^

Почему бы и нет?

Обновление

Я использую Scala 2.7.7final и ScalaCheck 2.7.7-1.6.

Обновление

Только что перешел на Scala 2.8.0.final с ScalaCheck 2.8.0-1.7. Проблема действительно ушла.

Ответы [ 2 ]

3 голосов
/ 17 августа 2010

Я только что попробовал это с Scala 2.8.0.final и ScalaCheck 1.7, созданных для того же самого. Оба импорта работали, то есть вторая строка дала желаемый результат для обоих импортов:

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

Какую версию Scala и ScalaCheck вы использовали?

0 голосов
/ 17 августа 2010

Простой: вы не импортировали неявное преобразование (как бы оно ни называлось), вы только импортировали что-то с именем value из объекта org.scalacheck.Gen.

Исправление / уточнение:

Gen.value (это object Gen, а не trait Gen[+T]) - это неявное выражение, используемое для переноса произвольных значений в экземпляре (реализации анонимного класса) trait Gen[T] (где T - функция из Gen.Params к аргументу, к которому применяется Gen.value). Gen.sample - это метод trait Gen[T], который вызывает его (конкретный Gen подкласс) apply метод для получения синтезированного значения.

К сожалению, присмотревшись, я должен признать, что не понимаю, почему код не работает, когда остальные члены object Gen не импортируются.

...