Разница между функцией и методами в scala [duplicate]

Как упоминалось ранее firelynx, если dtype явно указано, и есть смешанные данные, которые несовместимы с этим dtype, тогда загрузка будет аварийна. Я использовал такой конвертер как обходной путь для изменения значений с несовместимым типом данных, чтобы данные все равно могли быть загружены.

def conv(val):
    if not val:
        return 0    
    try:
        return np.float64(val)
    except:        
        return np.float64(0)

df = pd.read_csv(csv_file,converters={'COL_A':conv,'COL_B':conv})
218
задан 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 20 August 2018 в 08:19
поделиться
  • 1
    Это потому, что возврат захвачен закрытием. – Daniel C. Sobral 27 March 2010 в 17:07
  • 2
    Ого, я вижу, что это приводит к некоторому действительно запутанному коду ... – Phob 11 April 2013 в 16:36
  • 3
    Я не могу придумать ни одного случая, когда я хочу «вернуться» из функции в нелокальную область. На самом деле, я вижу, что это серьезная проблема безопасности, если функция может просто решить, что она хочет сделать резервную копию стека. Чувствует себя похожим на longjmp, только путь легче случайно ошибиться. Я заметил, что скалак не позволит мне вернуться из функций. Означает ли это, что эта мерзость поражена языком? – root 1 July 2013 в 22:19
  • 4
    @root - как насчет возврата изнутри for (a <- List(1, 2, 3)) { return ... }? Это освобождается от закрытия. – Ben Lings 2 July 2013 в 09:53
  • 5
    Честно говоря, я бы использовал другой синтаксис. имеют return возвращают значение из функции и некоторую форму escape или break или continue для возврата из методов. – Ryan The Leach 3 May 2016 в 15:58
210
ответ дан corazza 20 August 2018 в 08:19
поделиться

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

11
ответ дан eptx 20 August 2018 в 08:19
поделиться

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

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

31
ответ дан jamlhet 20 August 2018 в 08:19
поделиться
  • 1
    Функция может принадлежать классу как def или как val / var. Только def - это методы. – Josiah Yoder 19 August 2015 в 14:29

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

Функции: Они - в основном объект. Точнее, функции - это объекты с методом 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>
2
ответ дан Mehran 20 August 2018 в 08:19
поделиться
  • 1
    Что означает «назначить метод функции»? Означает ли это, что теперь у вас есть объект, который ведет себя так же, как это сделал метод? – K. M 16 August 2018 в 18:30

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

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 20 August 2018 в 08:19
поделиться
Другие вопросы по тегам:

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