Во-первых, функция входа
1. Определенные функции
Когда Scala определены функции, вы должны определить имя функции, параметры функции функции.
Наша первая функция заключается в следующем:
DEF SayHello (имя: String, Возраст: Int) = {
IF (Возраст> 18) {Е ( "% A Привет Big Boy \ п-S, вы", имя); Возраст }
еще {Е ( «% S Привет, вы Little Boy \ n-», имя);} Возраст
требования Scala должны быть предоставлены всем параметрам типа, но не обязательно дать тип возвращаемого значения функции, до тех пор , как функция права тело оператор не содержит рекурсию, Scala может определить тип возвращаемого в соответствии с их выражениями справа.
#########
Scala> Вставить
// Вход в режим Вставить (Ctrl-D , чтобы закончить)
DEF на SayHello (имя: String, Возраст: Int) = {
IF (Возраст> = 18) {
в Е ( «привет ,% \ п-S, A Big Boy ты! "имя)
Возраст
} {еще
Е (" Привет,% \ n- "S, A Little Boy вы !, имя)
Возраст
}
}
// выходящий Paste РЕЖИМА, теперь интерпретации.
SayHello: (имя: String, возраст: Int) Int
Скала> SayHello ( "Лев", 30)
Привет, Лев, ты большой мальчик!
res40: Int = 30
2, функция определена в блоке кода
Односторонняя функция: Защиту SayHello (имя: String) = печать ( «Привет,» + имя) Если несколько строк кода в теле функции, вы можете использовать блок кода способом посылки строк кода, блок кода возврата значение последней строки возвращаемое значение является целой функцией. В отличие от Java, вместо того , чтобы использовать возврат возвращаемого значения. Такие функции, как, для функции аккумулятора: DEF SUM (n-: Int) = { вар SUM = 0; для (I < - . 1 до n-) + SUM = I SUM } ###### Scala > Вставить // Вставить режим ввода (Ctrl-D , чтобы закончить) DEF SUM (n-: Int) = = {# , когда написано, возвращаемое значение функции есть переменная Result = 0 для (I < - 1 до n-.) { Результат + = I } Результат } Выход Вставить РЕЖИМ // теперь Устный. SUM (тот n-: Int) Int Scala> Сумма (10) res41: Int = 55
3, рекурсивные функции
Если рекурсивная функция является функцией самого тела, вы должны вручную вернуть тип функции даются. Например, чтобы достичь классического числа Фибоначчи: DEF Fab (н-: Int): Int = {# Int второй тип возврата IF (п < = 1. ) 1. Остальное FAB + Fab (N- (1-н.) 2) }
Во-вторых, параметры по умолчанию и параметры с именем
1, параметры по умолчанию
В Scala, иногда мы называем некоторые функции, мы не хотим , чтобы дать конкретные значения параметров, и вы хотите использовать свои собственные значения параметров по умолчанию, то используется определение параметров по умолчанию при определении функции.
SayHello DEF (Firstname: Строка, MiddleName: String = "Уильям",
LastName: String = "Крофт") = Firstname + "" + MiddleName + " " +
LastName
параметр , если не задано, то он будет применен последовательно с правой стороны параметры.
####
Scala> Вставить
// Вход в режим Вставить (Ctrl-D , чтобы закончить)
DEF на SayHello (имя: String, Возраст: Int = 20) {
Print ( "Hello" + имя + "вы IS Возраст" + Возраст)
}
// Выход из режима Paste, теперь Устный.
SayHello: (имя: String, Возраст: Int) Единица
Scala> SayHello ( "LEO")
вводное, LEO, вы Возраст 20 IS
Scala> SayHello ( "LEO", 30)
Привет, Лео, ты возраст 30
2, с именем параметра
При вызове функции, или не может функционировать в соответствии с порядком , определенными параметрами , чтобы передать параметры для передачи , но с использованием имени параметра.
SayHello (Firstname = «Мик», LastName = «Нина», MiddleName = «Джек»)
может быть также использована в сочетании с не назвали и имя параметра, параметр будет называться , но не в первом ряду с именем параметра.
SayHello ( "Мик", LastName = "Нина", ОТЧЕСТВО = "Джек")
#####
В-третьих, vararg
1, vararg
В Scala, мы , возможно , потребуется , чтобы функционировать в качестве переменного числа параметров , определенных форм, в это время можно использовать переменную параметра длину , определенную функцию. SUM DEF (в НУМС: Int *) = { вар RES = 0 для (NUM < - в Nums) + RES = NUM RES } ####### Scala > Вставить // Вход в режим Вставить (Ctrl-D , чтобы закончить) SUM DEF (в НУМС: Int *) = { вар Result = 0 для (NUM < - в Nums) { Результат + = NUM } Результат } . // выходящий Paste РЕЖИМА, теперь Устный SUM (в Nums: Int *) Int Scala > SUM (1,2,3,4,5) res44: Int = 15
2, использование переменной длины последовательности вызовов параметров
Если вы хотите иметь в последовательности функции аргументов переменной длины , которая вызывается непосредственно, это неправильно. Так , например Val S = сумма ( от 1 до 5 ). Скала случай требует специальных параметров синтаксиса определены как последовательности, так что интерпретатор может идентифицировать Scala. Этот синтаксис очень полезно! Вы должны быть хорошей идеей использовать много искрой к исходному коду. Val S = сумма ( от 1 до 5 : _ *) Случай: рекурсивная функция используется для накопления DEF sum2 (в НУМС: Int *): Int = { ЕСЛИ (nums.length == 0) 0 остальное nums.head + SUM2 (в НУМС. хвост: _ *) } ######## Scala> Вставить // Вход в режим Вставить (Ctrl-D , чтобы закончить) DEF SUM (в НУМС: Int *) = { вар Result = 0 для (NUM < - в НУМС ) { Результат + = NUM } Result } // выходящий Paste РЕЖИМА, теперь Устный. SUM (в Nums: Int *) Int Scala > . SUM (1. 5 до: _ *) res45: Int = 15 ## Скала>: наклеить // Переход в режим вставки (Ctrl-D , чтобы закончить) Защиту sum2 (НУМС: Int *): Int = { если (nums.length == 0) 0 еще nums.head + sum2 (nums.tail: _ *) } // Выход из режима вставки, теперь интерпретации. sum2: (НУМС: Int *) Int Скала> sum2 (1,2,3,4,5) res46: Int = 15
В-четвертых, процесс, ленивые значения и исключения
1, процесс
В Scala определения функции, если функция тела непосредственно обернуты в фигурные скобки, без использования = тип соединения значения , возвращаемого функцией является единицей. Такая функция вызывается для обработки.
Функция не требует процесса , обычно используемый для возвращаемого значения.
Существует также процесс написания, это тип возвращаемого значения функции определяются как единица.
DEF SayHello (имя: String) = "вводное," + имя
DEF SayHello (имя: String) {Print ( "Hello," + имя); "вводное," + имя}
DEF SayHello (имя: String): Unit = " привет, "имя +
######
Scala> DEF SayHello (имя: String) {Print (" Hello, "+ имя)," Привет, «имя} +
SayHello: (имя: String) Единица
Scala> SayHello ( "LEO")
Здравствуйте, LEO
Scala> DEF SayHello (имя: String) = {Print ( "Hello," + имя); "вводное," + имя}
SayHello: (имя: String) Строка
Scala> SayHello ( "LEO" )
вводная, leores48: String = вводный,
SayHello: (имя: String) Единица
масштаб>
2, ленивое значение
В Scala предоставляет возможности ленивого значения, то есть, если переменная объявлена как ленивое, только при первом использовании переменного, переменный , соответствующая оценке экспрессии будет происходить. Эта особенность особенно полезна для вычисления трудоемких операций, таких как открытие файлов Л.О., Л.О. сети , как. scala.io.Source._ Импорт ленивым Val Lines = FromFile. ( «C: /Users/Administrator/Desktop/test.txt») mkString Даже если файл не существует, никакая ошибка не будет, будет жаловаться , когда только первый , используя переменную проверенный ленивый расчет характерного выражения. Линии FromFile = Val ( "C: //Users//Administrator/Desktop/test.txt") .mkString отложенной Вал линий FromFile = ( "C: //Users/Administrator//Desktop/test.txt") .mkString DEF из FromFile = строк. ( "C :. // Пользователи / Администратор / Desktop / TXT Test") mkString ####### Scala> = ленивых Val линии FromFile ( "Home // // test.txt") mkString. линии: String = < ленивого > Scala> Версия для печати (линия) вводное слово
3, аномальное
В Scala, обработка исключений и механизм захвата очень похожи на Java.
{Попробовать
вбрасывание новый новый lllegalArgumentException ( "X не должен быть отрицательным")
} {подвох
Case _: = lllegalArgumentException> Пе ( "lllegal Аргумент!")
} Окончательно {
Print ( "Release Resources!")
######## #####