2015-01-25 4 views
1

Можете ли вы сделать анонимный val?Предоставляет ли Scala способ анонимного val?

Я имею в виду сделать что-то вроде этого:

case class NumIterations[A](num: Int) 
case class Seed[A](seed: A) 
case class Manipulate[A](f: A => A) 
. . . 

def funcWithGobsOfImplicitArgs[A](
    implicit numIterations: NumIterations[A], 
      seed: Seed[A], 
      manipulate: Manipulate[A], 
      . . . 
): A = . . . 

def apply(): String = { 
    implicit val NumIterations[String](10) // This is where I want anonymous vals 
    implicit val Seed("xyz") 
    . . . 
    funcWithGobsOfImplicitArgs 
} 

Хорошо, что делает все из аргументов функции неявных, вероятно, будет за бортом, но у меня есть реальное применение, где это удобно придерживаться некоторых параметры функции в области, а затем повторно использовать и переопределять их. Это делает эксперимент с функцией очень удобной. Я могу играть с одним параметром за раз в явном виде, и пусть все остальные будут предоставлены неявно.

В этой ситуации было бы неплохо не называть val, так как имя занимает место в вашей голове, а полный смысл val предоставляется только его типом. Когда у меня был только один из этих vals, я назвал его _, считая, что Scala будет относиться к нему как к val, который никогда не упоминается явно. Но когда я назвал два vals _, Скала пожаловалась.

+1

Почему бы просто не называть валы, как вы их называете, в параметрах функции, т. Е. 'Implicit val seed = Seed (" xyz ")'? – phadej

+0

@OlegGrenrus Вот что я делал, на самом деле. Я мог бы жить с этим. Тем не менее, разве это не кажется излишним? –

ответ

1

Нет, вам нужно называть ваш вал. Вообще я думаю, что ваша идея делает код очень сложным для поддержания и понимания. Если в контексте у меня есть две функции, у них есть целочисленный неявный параметр, который концептуальное значение этих двух параметров полностью отличается, я буду определять два разных класса значений и изменить тип аргумента функции на эти классы значений, поэтому теперь я определю два разных vals типа эти классы значений в контексте.

class Arg1(arg: Int) extends AnyVal 
class Arg2(arg: Int) extends AnyVal 
def f1(implicit arg: Arg1) 
def f2(implicit arg: Arg2) 
implicit val arg1 = new Arg1(1) 
implicit val arg2 = new Arg2(2) 
f1 // will pick arg1 
f2 // will pick arg2 

Но если концептуальный смысл аргументов одинаковы (как исполнения ExecutionContext, например), то я называю это ExecutionContext и определить его как подразумевается в контексте, поэтому все функции требует, что аргумент будет использовать что ,

Смежные вопросы