Функция и метод в Scala [duplicate]

В PHP вам нужно либо использовать функции multibyte , либо включить mbstring.func_overload . Таким образом, такие вещи, как strlen, будут работать, если у вас есть символы, которые принимают более одного байта.

Вам также потребуется определить набор символов ваших ответов. Вы можете использовать AddDefaultCharset, как указано выше, или написать PHP-код, который возвращает заголовок. (Или вы можете добавить тег META в свои HTML-документы.)

219
задан Peter Mortensen 25 May 2013 в 20:20
поделиться

6 ответов

Одно большое практическое различие между методом и функцией - это то, что означает return. return только когда-либо возвращается из метода. Например:

scala> val f = () => { return "test" }
<console>:4: error: return outside method definition
       val f = () => { return "test" }
                       ^

Возврат из функции, определенной в методе, выполняет нелокальный возврат:

scala> def f: String = {                 
     |    val g = () => { return "test" }
     | g()                               
     | "not this"
     | }
f: String

scala> f
res4: String = test

В то время как возврат из локального метода возвращается только из этого метода.

scala> def f2: String = {         
     | def g(): String = { return "test" }
     | g()
     | "is this"
     | }
f2: String

scala> f2
res5: String = is this
64
ответ дан Ben Lings 31 August 2018 в 13:17
поделиться
210
ответ дан corazza 31 August 2018 в 13:17
поделиться

Функции не поддерживают параметры по умолчанию. Способы делают. Преобразование из метода в функцию теряет параметры по умолчанию. (Scala 2.8.1)

11
ответ дан eptx 31 August 2018 в 13:17
поделиться

function Функция может быть вызвана со списком аргументов для получения результата. Функция имеет список параметров, тело и тип результата. Функции, являющиеся членами класса, свойства или одиночного объекта, называются методами. Функции, определенные внутри других функций, называются локальными функциями. Функции с типом результата Unit называются процедурами. Анонимные функции в исходном коде называются функциональными литералами. Во время выполнения функциональные литералы создаются в объекты, называемые значениями функций.

Программирование в Scala Second Edition. Мартин Одерски - Лекс Ложка - Билл Веннерс

31
ответ дан jamlhet 31 August 2018 в 13:17
поделиться

Здесь есть хорошая статья , из которой взяты большинство моих описаний. Просто короткое сравнение функций и методов, касающихся моего понимания. Надеюсь, что это поможет:

Функции: Они - в основном объект. Точнее, функции - это объекты с методом apply; Поэтому они немного медленнее, чем методы из-за их накладных расходов. Это похоже на статические методы в том смысле, что они не зависят от вызываемого объекта. Простой пример функции аналогичен приведенному ниже:

val f1 = (x: Int) => x + x
f1(2)  // 4

Строка выше ничего, кроме назначения одного объекта другому, как object1 = object2. На самом деле объект2 в нашем примере является анонимной функцией, и из-за этого левая сторона получает тип объекта. Следовательно, теперь f1 является объектом (Function). Анонимная функция на самом деле является экземпляром Function1 [Int, Int], что означает функцию с 1 параметром типа Int и возвращаемое значение типа Int. Вызов f1 без аргументов даст нам подпись анонимной функции (Int => Int =)

Методы: они не являются объектами, а назначаются экземпляру класса, т. Е. Объекта. Точно так же, как метод в java или функции-члене в c ++ (как Raffi Khatchadourian указал в комментарии к этот вопрос ) и т. Д. Простым примером метода является просто например:

def m1(x: Int) = x + x
m1(2)  // 4

Строка выше - это не простое назначение значений, а определение метода. Когда вы вызываете этот метод со значением 2 как вторая строка, x заменяется на 2, и результат будет вычисляться, и вы получите 4 в качестве вывода. Здесь вы получите сообщение об ошибке, если просто напишите m1, потому что это метод и ему нужно значение ввода. Используя _, вы можете назначить метод функции, подобной приведенной ниже:

val f2 = m1 _  // Int => Int = <function1>
3
ответ дан Mehran 31 August 2018 в 13:17
поделиться

Пусть у вас есть список

scala> val x =List.range(10,20)
x: List[Int] = List(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)

Определить метод

scala> def m1(i:Int)=i+2
m1: (i: Int)Int

Определить функцию

scala> (i:Int)=>i+2
res0: Int => Int = <function1>

scala> x.map((x)=>x+2)
res2: List[Int] = List(12, 13, 14, 15, 16, 17, 18, 19, 20, 21)

Метод принятия аргумента

scala> m1(2)
res3: Int = 4

Определение функции с val

scala> val p =(i:Int)=>i+2
p: Int => Int = <function1>

Аргумент функции необязателен

 scala> p(2)
    res4: Int = 4

scala> p
res5: Int => Int = <function1>

Аргумент метода обязателен

scala> m1
<console>:9: error: missing arguments for method m1;
follow this method with `_' if you want to treat it as a partially applied function

Проверьте следующее Учебное пособие , в котором объясняется передача других различий примерами, например, другим примером diff с функцией Vs Function, использованием функции в качестве переменных, созданием функции, возвращающей функцию

26
ответ дан Salil 31 August 2018 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: