Scala方法和函数的区别是什么

  介绍

这期内容当中小编将会给大家带来有关Scala方法和函数的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Scala中既有函数(函数)也有方法(方法),大多数情况下我们都可以不去理会他们之间的区别。但是有时候我们必须要了解他们之间的不同。

Scala中的方法跟Java的方法一样,方法是<强>组成类的一部分强。方法有名字,类型签的名,有时方法上还有注解,以及方法的功能实现代码(字节码)。

Scala中的函数是一个完整的对象. Scala中用22个<强>特质(特征)抽象出了函数的概念。这22特质从Function1到Function22:

 Scala方法和函数的区别是什么

如上图中的Function10代表的是:有10个形参,返回值为R(协变)的函数。

函数更常使用的是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称如果你要是用的话,一般会把这个匿名函数赋值给一个变量(其实是val常量),
,表现形式:(传入参数)=祝辞{方法体}

 val  f =,(名字:字符串)=祝辞println(“嗨,“+名字)
  ,f (“kafka") 

Scala中的函数其实就是继承了这些特征的类的对象,如:我们通过函数字面量定义一个<强>函数

 Scala方法和函数的区别是什么

,其实上述函数的定义方式跟如下定义方式等同:

 Scala方法和函数的区别是什么

由于Function2是特质,不能直接新的。上述,新Function2 (Int, Int, Int)(){},其实是定义并实例化一个实现了Function2特质的类的对象。

是Scala中应用的语法糖:对一个对象obj上调用obj (), Scala编译器会转换为obj.apply();在一个类clazz上调clazz (), Scala编译器会转换为clazz_company_obj.apply(),其中clazz_company_obj为clazz的伴生对象。

<强>具体的差异,总结为如下几点:

1。方法不能作为单独的表达式而存在(参数为空的方法除外),而函数可以。如:

 scala>, def  m (x: Int),=2.0 * x
  m:, (x: Int) Double ,,方法的定义
  
  scala>, val  f =, (x: Int)=祝辞,2.0 * x 
  f: Int =祝辞,Double =, & lt; function1>,,函数定义
  
  scala> f
  res7: Int =祝辞,Double =, & lt; function1>,函数就是
  
  scala>, val  tmp =, m  _ ,通过这个方式还可以实现方法到函数的变化
  tmp: Int =祝辞,Double =, & lt; function1>
  
  scala>, m ,直接调用方法名是错误的
  时间:13:& lt; console>错误:,missing  argument  list  for  method  m
  Unapplied  methods 断开连接;only  converted 用functions  when  a  function  type  is 预期。
  你还要make 却;能够conversion  explicit  by  writing “m  _”,或“m (_)”, instead  of “m”。
  ,,,,,,
  ,,,,,^
  
  在Scala语言中,函数也是对象,,每一个对象都是scala.FunctionN(22页)的实例,,其中N是函数参数的数量,,例如我们定义一个函数并复制给一个变量:
  
  scala>, val  f =, (x: Int),=祝辞,x  +, 1,(匿名函数的写法)
  f: Int =祝辞,Int =, & lt; function1>
  ,这里定义了一个接收一个整型变量作为参数的函数,,函数的功能是返回输入参数加1只可以看到REPL返回参数的toString方法,即,& lt; function0>,只
  ,那么如果我们有一个指向函数对象的引用,,我们该如何调用这个函数呢?,答案是通过FunctionN的,apply 方法,,即,FunctionN.apply(),,,因此调用函数对象的方法如下:,
  
  scala>, f.apply (3)
  它:Int =, 4
  但是如果每次调用方法对象都要通过FunctionN.apply (x, y…),就会略显啰嗦,Scala,提供一种模仿函数调用的格式来调用函数对象
  
  scala>, f (3)
  res3: Int =, 4 

在如上的例子中,我们首先定义了一个方法,接着有定义了一个函数f。接着我们把函数名(函数值)当作最终表达式来用,由于f本身就是一个对象(实现了FunctionN特质的对象),所以这种使用方式是完全正确的。但是我们把方法名当成最终表达式来使用的话,就会出错。

<强> 2。方法可以没有参数列表而,函数必须要有参数列表

 scala>, def  m1 =100
  m1: Int 没有入参的方法定义,是下面的简写形式
  
  scala>, def  m2 (),=100
  m2:, () Int 无入参的放到定义
  
  scala>, val  f1 =,()=祝辞;100年,,无入参的函数定义
  f1:,(),=祝辞,Int =, & lt; function0>
  
  scala>, val  f1 =,=祝辞,100,,仿照最上面写就直接报的错
  & lt; console>: 1:错误:,illegal  start  of  simple 表达式
  val  f1 =,=祝辞,100 

Scala方法和函数的区别是什么