/ / Чи можна визначити функцію Scala, доступ до якої можна отримати лише з іншої ознаки? - скала

Чи можна визначити функцію Scala, доступ до якої можна отримати лише з іншої ознаки? - скала

приватний [] або захищений [] модифікатор доступу, безумовно, не допоможе. Чи відсутня ця функція?

Відповіді:

5 за відповідь № 1

Це неможливо зробити з обмеженнями доступу до методу, визначеними мовою, але ви можете емулювати його неявними аргументами

  // A.scala
trait A {
def foo(i: Int)(implicit accessKey: B.AccessKey) = {
println(s"A = $i")
}
}

// B.scala
object B {
sealed trait AccessKey
}

trait B {
private[B] implicit object AccessKeyInstance extends AccessKey

def bar(a: A) = a.foo(10)
}

// C.scala
trait C {
def bar(a: A) = a.foo(20) // Implicit not found error
}

Ви можете розмістити лише один неявний екземпляр AccessKey за ознакою B, і риса C не матиме доступу до неї.

Однак цей трюк не працює, якщо ви помістіть риси B та C у файлі single-scala, у цьому випадку ви зможете створити другий екземпляр AccessKey.