Подтвердить что ты не робот

Как определить метод в Scala, который возвращает тип?

Я хочу определить частный метод в классе scala singleton, который выглядит следующим образом:

private def  createDomNode(tag: String, attrs: Map[String , String]): DomNode  {

}

DomNode - это тип Java, а не scala. attrs - это scala Карта с обоими ключами и значением типа String.

Но выше дает ошибку. Каков правильный формат?

Спасибо Easy Angel за ответ. Есть еще какая-то путаница. Согласно Программе в книге scala, написанной изобретателем языка, ниже приведена функция:

def max(x: Int, y: Int): Int = {
  if (x > y) x
  else y
}

Но ваш ответ говорит, что это метод, а не функция. Можете ли вы любезно объяснить?

Что такое REPL?

4b9b3361

Ответ 1

Вы должны просто положить =:

private def createDomNode(tag: String, attrs: Map[String , String]): DomNode = {
    // ...
}

Если вы не ставите = между сигнатурой метода и телом, тогда тип возврата Unit, поэтому это:

def m(i: Int) {}

совпадает с

def m(i: Int): Unit = {}

Ответ на комментарий: то, что я описал ранее, на самом деле является методом, если вы определяете его в определении object, class или trait. Синтаксис функции будет выглядеть так:

val createDomNode: (String, Map[String , String]) => DomNode = { (tag, attrs) =>
    // ...
}

Как видите, я определяю val с именем createDomNode типа функции. Его также можно записать так:

val createDomNode: Function2[String, Map[String , String], DomNode] = { (tag, attrs) =>
    // ...
}

вот еще один пример. В этом случае я определяю метод, который генерирует новую функцию каждый раз, когда вы вызываете ее:

def createDomNode = (tag: String, attrs: Map[String , String]) => new DomNode

Но важно понять, что этот метод возвращает "функцию, возвращающую DomNode" в этом случае, но не DomNode.


О программировании в справочнике Scala. Я думаю, вы говорите о Глава 2 - Шаг 3 (во вступительной части)

Как вы видите, функция max определена в REPL, и она действительно функционирует. На самом деле вы также можете написать что-то вроде этого:

class MyClass {
    def myMethod(i: Int): Int = {
        def myInnerFn(x: Int) = x * x

        myInnerFn(i)
    }
}

В этом случае myMethod - метод, а myInnerFn - функция. Итак, как вы можете видеть, это сильно зависит от контекста. Я считаю, что этот синтаксис для myInnerFn - это просто синтаксический сахар для (мне нужно посмотреть в спецификации, чтобы точно сказать):

val myInnerFn = (x: Int) => x * x

То же самое происходит в REPL. И кстати, потому что я писал в начале:

если вы определяете его в object, class или trait определении

Извините, мне нужно быть более ясным об этом и описать его более подробно во втором обновлении.


Я просмотрел спецификацию Scala. Кажется, я не совсем прав, когда говорю, что myInnerFn является синтаксическим сахаром для функции. но кажется, что он называется Тип метода. Вы можете найти его в разделе spec 3.3.1 Тип метода:

http://www.scala-lang.org/docu/files/ScalaReference.pdf

надеюсь, что это даст вам некоторое представление, если вы хотите погрузиться глубже в это. Я думаю, что легко потеряться в терминологии. Вы можете function в двух контекстах. Вначале имеем

  • Функция - возвращает некоторое значение
  • Процедура - не возвращает значение (или в Scala контексте возвращает Unit)

И во втором контексте:

  • Функция - исполняемый фрагмент кода, который может проходить и обрабатываться как значение
  • Метод - принадлежит классу

И иногда неясно, в каком контексте это означало. Например, я могу сказать вам, что myMethod является как функция только потому, что имеет возвращаемое значение (или, другими словами: myMethod это не процедура). Я считаю, что тот же случай в книге.


Еще одна вещь. Разделы 8.1, 8.2, 8.3 от программирования в Scala могут помочь вам понять эту терминологию. И если я прав в своих предположениях, то, что вы думаете как function, называется First-class function в книге (это описано в разделе 8.3).

Надеюсь, что это поможет