Difference between method and function in Scala

后端 未结 9 2031
温柔的废话
温柔的废话 2020-11-21 07:22

I read Scala Functions (part of Another tour of Scala). In that post he stated:

Methods and functions are not the same thing

相关标签:
9条回答
  • 2020-11-21 08:02

    Here is a great post by Rob Norris which explains the difference, here is a TL;DR

    Methods in Scala are not values, but functions are. You can construct a function that delegates to a method via η-expansion (triggered by the trailing underscore thingy).

    with the following definition:

    a method is something defined with def and a value is something you can assign to a val

    In a nutshell (extract from the blog):

    When we define a method we see that we cannot assign it to a val.

    scala> def add1(n: Int): Int = n + 1
    add1: (n: Int)Int
    
    scala> val f = add1
    <console>:8: error: missing arguments for method add1;
    follow this method with `_' if you want to treat it as a partially applied function
           val f = add1
    

    Note also the type of add1, which doesn’t look normal; you can’t declare a variable of type (n: Int)Int. Methods are not values.

    However, by adding the η-expansion postfix operator (η is pronounced “eta”), we can turn the method into a function value. Note the type of f.

    scala> val f = add1 _
    f: Int => Int = <function1>
    
    scala> f(3)
    res0: Int = 4
    

    The effect of _ is to perform the equivalent of the following: we construct a Function1 instance that delegates to our method.

    scala> val g = new Function1[Int, Int] { def apply(n: Int): Int = add1(n) }
    g: Int => Int = <function1>
    
    scala> g(3)
    res18: Int = 4
    
    0 讨论(0)
  • 2020-11-21 08:05

    Practically, a Scala programmer only needs to know the following three rules to use functions and methods properly:

    • Methods defined by def and function literals defined by => are functions. It is defined in page 143, Chapter 8 in the book of Programming in Scala, 4th edition.
    • Function values are objects that can be passed around as any values. Function literals and partially applied functions are function values.
    • You can leave off the underscore of a partially applied function if a function value is required at a point in the code. For example: someNumber.foreach(println)

    After four editions of Programming in Scala, it is still an issue for people to differentiate the two important concepts: function and function value because all editions don't give a clear explanation. The language specification is too complicated. I found the above rules are simple and accurate.

    0 讨论(0)
  • 2020-11-21 08:14

    Let Say you have a List

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

    Define a Method

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

    Define a Function

    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)
    

    Method Accepting Argument

    scala> m1(2)
    res3: Int = 4
    

    Defining Function with val

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

    Argument to function is Optional

     scala> p(2)
        res4: Int = 4
    
    scala> p
    res5: Int => Int = <function1>
    

    Argument to Method is Mandatory

    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
    

    Check the following Tutorial that explains passing other differences with examples like other example of diff with Method Vs Function, Using function as Variables, creating function that returned function

    0 讨论(0)
提交回复
热议问题