Прямая ссылка распространяется на определение проблемы стоимости - PullRequest
2 голосов
/ 29 июля 2011

У меня есть некоторые проблемы в Scala для разрешения неявных значений, и у меня есть загадочное сообщение об ошибке в NetBeans:

"Ошибка: прямая ссылка распространяется на определение значения ..."

или в консоли scala у меня есть другое сообщение об ошибке

"несоответствие типов: 29: ошибка: несоответствие типов; найдено: требуется Factory.type (с базовым объектом типа Factory): GenericFactory "

Некоторое описание моего класса и основной функции:

import java.util.Random

//////////
// Main //

//Implicit random for all classes and object
implicit val aprng = new Random

//Implicit object Factory used in other class
implicit val factory = Factory

abstract class GenericFactory {
def build 
}

object Factory extends GenericFactory{
def build = println("return factory")
}

class A (rate: Random => Double = aprng => aprng.nextFloat, val factory : GenericFactory) {

  def this(rate : Double, factory : GenericFactory) = this( _ => rate, factory)

  def operate(genomes: IndexedSeq[Int])(implicit aprng: Random) = { 
println("calculate genomes with aprng random values")}
}

object B{
val instanceOfA = new A(rate => 0.5d,factory)
}

У меня 2 проблемы, потому что 1) я могу передать объект в качестве аргумента класса A, поэтому яопределите абстрактный класс для передачи этого абстрактного класса, но он здесь не работает: / 2) После этого мое неявное значение, определенное в классе A, не распознается и завершается ошибкой с сообщением об ошибке.

У вас есть идея или ответ для решения этой проблемы?

Редактировать 1

Я обновляю код с помощью agisteel, все в порядке, код выполняется:)

import java.util.Random

//////////
// Main //

//Implicit random for all classes and object
implicit val aprng = new Random
implicit val function: Random => Double = arpng => arpng.nextFloat

abstract class GenericFactory 
{
  def build = println("build")
}

implicit object Factory extends GenericFactory
{
  def build = println("return factory")
}

class A (implicit rate: Random => Double, implicit val factory : GenericFactory) {

  //def this(rate : Double, factory : GenericFactory) = this( _ => rate, factory)

  def operate(genomes: IndexedSeq[Int])(implicit aprng: Random) = { 
    println("calculate genomes with aprng random values")}
}

object B{
val instanceOfA = new A
}

1 Ответ

3 голосов
/ 29 июля 2011

Я не уверен, чего вы здесь добиваетесь, но вот несколько советов:

1) вместо:

implicit val factory = Factory
object Factory extends GenericFactory { ...

попробуйте это:

implicit object Factory extends GenericFactory { ...

2) Значения по умолчанию для лямбда-выражений, насколько я знаю, могут быть предоставлены только через имплициты, поэтому вместо:

class A (rate: Random => Double = aprng => aprng.nextFloat, ...

попробуйте это:

implicit val function: Random => Double = arpng => arpng.nextFloat
class A (implicit rate: Random => Double) ( ...

Надеюсьинформация полезна.

...