【scala】scala之method和function的区别

写在前面:函数和属性的区别, 函数节省空间而需要每次计算, 属性是初始化时算好的, 比较快, 但需要额外的空间, 所以可用在不同场景下选择不同实现

1. 如何定义

首先,还是引用英文原文来看看他们在定义上的区别和联系吧:

Function Type is (roughly) a type of the form (T1, ..., Tn) => U, which is a shorthand for the trait FunctionN in the standard library. Anonymous Functions and Method Values have function types, and function types can be used as part of value, variable and function declarations and definitions. In fact, it can be part of a method type.

Method Type is a non-value type. That means there is no value - no object, no instance - with a method type. As mentioned above, a Method Value actually has a Function Type. A method type is a def declaration - everything about a def except its body.

2. 具体例子分析

1 scala> def m1(x:Int) = x+3
2 m1: (x: Int)Int    
3 
4 scala> val f1 = (x: Int) => x+3
5 f1: Int => Int = <function1>

从上面的例子,得出一个总结:

1.方法是一个以def开头的带有参数列表(可以无参数列表)的一个逻辑操作块,这正如object或者class中的成员方法一样。

函数是一个赋值给一个变量(或者常量)的匿名方法(带或者不带参数列表),并且通过=>转换符号跟上逻辑代码块的一个表达式。=>转换符号后面的逻辑代码块的写法与method的body部分相同。

2.method可以作为一个表达式的一部分出现(调用函数并传参),但是method(带参方法)不能作为最终的表达式(无参方法可以,但是这个就成了方法调用,因为scala允许无参方法调用时省略()括号),而function可以作为最终的表达式出现。

1 scala> m1
2 <console>:12: error: missing arguments for method m1;
3 follow this method with `_' if you want to treat it as a partially applied function
4        m1
5        ^
6 
7 scala> f1
8 res1: Int => Int = <function1>

3.method可以没有参数列表,参数列表也可以为空。但是function必须有参数列表(也可以为空)。方法名意味着方法调用,函数名只是代表函数自身

1 scala> def m2 = 100;
 2 m2: Int
 3 
 4 scala> def m3() = 1000;
 5 m3: ()Int
 6 
 7 scala> var f2 = => 100;
 8 <console>:1: error: illegal start of simple expression
 9 var f2 = => 100;
10          ^
11 
12 scala> var f2 =()=> 100;
13 f2: () => Int = <function0>

4.在函数出现的地方我们可以提供一个方法。

这是因为,如果期望出现函数的地方我们提供了一个方法的话,该方法就会自动被转换成函数。该行为被称为ETA expansion。

注意:

期望出现函数的地方,我们可以使用方法。

不期望出现函数的地方,方法并不会自动转换成函数

在scala中操作符被解释称方法:  

  • 前缀操作符:op obj 被解释称obj.op
  • 中缀操作符:obj1 op obj2被解释称obj1.op(obj2)
  • 后缀操作符:obj op被解释称obj.op
1 scala> val ml = List(1,2,3,4)
 2 ml: List[Int] = List(1, 2, 3, 4)
 3 
 4 scala> ml.map((x)=>2*x)
 5 res0: List[Int] = List(2, 4, 6, 8)
 6 
 7 scala> def m(x:Int) = 2*x
 8 m: (x: Int)Int
 9 
10 scala> ml.map(m)
11 res1: List[Int] = List(2, 4, 6, 8)
12 
13 scala> def m(x:Int) = 3*x
14 m: (x: Int)Int
15 
16 scala> ml.map(m)
17 res2: List[Int] = List(3, 6, 9, 12)

5.可以在方法名后面加一个下划线强制变成函数。 注意: 方法名与下划线之间至少有一个空格哟!

 1 scala> def m3(x: Int): Int = x * x * x
 2 m3: (x: Int)Int
 3 
 4 scala> val f3 = m3_
 5 <console>:10: error: not found: value m3_
 6        val f3 = m3_
 7                 ^
 8 
 9 scala> val f3 = m3 _
10 f3: Int => Int = <function1>
11 
12 scala> f3(3)
13 res0: Int = 27

参考
https://www.cnblogs.com/shihuc/p/5082701.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值