(Я довольно новичок в Scala, надеюсь, это не глупый вопрос.)
Из того, что я вижу, объявление параметра функции implicit
имеет two (связанный, но совершенно другой) использует:
Это делает явной передачу соответствующего аргумента при вызове данной функции необязательным, когда компилятор может найти уникальное подходящее значение дляpass (в области вызова).
Это делает сам параметр подходящим значением для передачи другим функциям с неявными параметрами (при вызове их из заданногофункция).
В коде:
def someFunction(implicit someParameter: SomeClass) = { // Note `implicit`
...
// Note no argument supplied in following call;
// possible thanks to the combination of
// `implicit` in `someOtherFunction` (1) and
// `implicit` in line 1 above (2)
someOtherFunction
...
}
def someOtherFunction(implicit someOtherParameter: SomeClass) = {
...
}
implicit val someValue = new SomeClass(...)
// Note no argument supplied in following call;
// possible thanks to `implicit` (1)
someFunction
Это кажется несколько странным, не так ли?Удаление implicit
из строки 1 приведет к тому, что оба вызова (на someFunction
из другого места и на someOtherFunction
из someFunction
) не будут скомпилированы.
Что за этим стоит?( Редактировать: Я имею в виду, каково официальное обоснование, в случае, если что-либо можно найти в каком-то официальном ресурсе Scala.)
И есть ли способ добиться этогобез другого (то есть, чтобы неявно передавать аргумент функции, не позволяя неявно использовать его внутри этой функции при вызове других функций, и / или неявно использовать неявный параметр при вызове других функций)?( Edit: Я немного изменил вопрос. Также, чтобы уточнить, я имею в виду, есть ли языковая конструкция, позволяющая это - не достижение эффекта с помощью ручного затенения или подобного.)