Ответ 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).
Надеюсь, что это поможет