Как получить доступ к вложенной функции в объекте scala - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь получить доступ к вложенной функции. Я могу получить доступ к func1, но у меня возникают проблемы при попытке доступа к func2.

// пытаемся вызвать методы в другом классе

val t1 = test
t1.func1()
t1.func1(df).func2("test")

object test {
    def func1 (df: dataframe): tt = {

      def func2 (ab: String): String =  {
        // do something
      } else {
        // do nothing
      }

      def func3 (ab2: String): String = {
        //do something
      } else {
        // do nothing
      }

    }

  val t1 = test
  t1.func1()
  t1.func1(df).func2("test")

Я ожидаю получить доступ к func2 без каких-либо ошибок

Ответы [ 2 ]

4 голосов
/ 25 июня 2019

Вы можете считать func2 эквивалентом вложенной переменной.Вы не можете получить доступ к этому вне его родительской функции.

Попробуйте изменить несколько вещей, чтобы сделать этот пример более наглядным:

object test {
    def func1 (df: dataframe): String = {
        val data = "hi"
        "bye"
    }
}
val t1 = test
t1.func1(df).data

Ожидаете ли вы получить доступ к data здесь?

Если вы попытаетесьчтобы сделать ссылку на func2 вне func1, вы получите ошибку компилятора.

Если вам нужен доступ к func2 и у вас нет других ограничений, я бы рекомендовал определить еговыходит за рамки func1.

3 голосов
/ 25 июня 2019

Свойство closure предотвращает доступ к захваченным идентификаторам за пределами закрытой области видимости.Использование объекта или класса вместо функции и применение соответствующей перегрузки сделало бы доступной внутреннюю область.

object test {

    case class func1(df: dataframe){

        def apply(..)= {..}

        def func2 (ab: String): String =  {..}
        def func3 (ab2: String): String = {..}
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...