scala之method和function的区别
在我没有学习scala的时候,主要用java和python做日常工作开发,印象中,没有特别的刻意的去区分method和function的区别,这个关系,正如我们日常生活中,没有刻意的去区分质量和重量。但是,他们之间,的确是有所不同的,这些不同也是建立在他们之间有联系的基础之上!
1. 如何定义
首先,还是引用英文原文来看看他们在定义上的区别和联系吧:
A 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.
A 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. 具体例子分析
scala> def m1(x:Int) = x+3
m1: (x: Int)Int scala> val f1 = (x: Int) => x+3
f1: Int => Int = <function1>
看到没,方法定义和函数定义是不是在scala的解析器signature上就有显示了,def m1(x: Int) = x+3就是一个简单的method的定义。signature中m1: (x: Int)Int 表示method m1有一个参数Int型参数x,返回值是Int型。
val f1 = (x: Int) => x+3则是function的定义,解析器的signature中f1: Int => Int = <function1>表示function f1的method体接受一个Int型的参数,输出结果的类型是Int型。
从上面的例子,得出一个总结:
方法是一个以def开头的带有参数列表(可以无参数列表)的一个逻辑操作块,这正如object或者class中的成员方法一样。
函数是一个赋值给一个变量(或者常量)的匿名方法(带或者不带参数列表),并且通过=>转换符号跟上逻辑代码块的一个表达式。=>转换符号后面的逻辑代码块的写法与method的body部分相同。
3. 区别都还有那些?
|
method可以作为一个表达式的一部分出现(调用函数并传参),但是method(带参方法)不能作为最终的表达式(无参方法可以,但是这个就成了方法调用,因为scala允许无参方法调用时省略()括号),而function可以作为最终的表达式出现。 |
scala> m1
<console>:12: error: missing arguments for method m1;
follow this method with `_' if you want to treat it as a partially applied function
m1
^ scala> f1
res1: Int => Int = <function1>
| method可以没有参数列表,参数列表也可以为空。但是function必须有参数列表(也可以为空)。方法名意味着方法调用,函数名只是代表函数自身 |
scala> def m2 = 100;
m2: Int scala> def m3() = 1000;
m3: ()Int scala> var f2 = => 100;
<console>:1: error: illegal start of simple expression
var f2 = => 100;
^ scala> var f2 =()=> 100;
f2: () => Int = <function0>
scala> m2
res2: Int = 100 scala> m3
res3: Int = 1000 scala> m3()
res4: Int = 1000 scala> f2
res5: () => Int = <function0> scala> f2()
res6: Int = 100
|
在函数出现的地方我们可以提供一个方法。 这是因为,如果期望出现函数的地方我们提供了一个方法的话,该方法就会自动被转换成函数。该行为被称为ETA expansion。 注意: 期望出现函数的地方,我们可以使用方法。 不期望出现函数的地方,方法并不会自动转换成函数 在scala中操作符被解释称方法:
|
scala> val ml = List(1,2,3,4)
ml: List[Int] = List(1, 2, 3, 4) scala> ml.map((x)=>2*x)
res0: List[Int] = List(2, 4, 6, 8) scala> def m(x:Int) = 2*x
m: (x: Int)Int scala> ml.map(m)
res1: List[Int] = List(2, 4, 6, 8) scala> def m(x:Int) = 3*x
m: (x: Int)Int scala> ml.map(m)
res2: List[Int] = List(3, 6, 9, 12)
| 可以在方法名后面加一个下划线强制变成函数。 注意: 方法名与下划线之间至少有一个空格哟! |
scala> def m3(x: Int): Int = x * x * x
m3: (x: Int)Int scala> val f3 = m3_
<console>:10: error: not found: value m3_
val f3 = m3_
^ scala> val f3 = m3 _
f3: Int => Int = <function1> scala> f3(3)
res0: Int = 27
scala之method和function的区别的更多相关文章
- Java细节----method和function的区别
面向对象的语言叫方法 面向过程的语言叫函数 在java中没有函数这么一说,只有方法一说.属于概念上的区别. 硬要说区别. Method必须依赖于Object. Function 是独立的,不需要依赖于 ...
- Vue中method与computed的区别
为了说明method与computed的区别,在此我想先来看看computed属性在vue官网中的说法:模板内的表达式是非常便利的,但是它们实际上只用于简单的运算.在模板中放入太多的逻辑会让模板过重且 ...
- 转:jquery的$(function(){})和$(document).ready(function(){}) 的区别
原文链接:https://www.cnblogs.com/slyzly/articles/7809935.html [转载]jquery的$(function(){})和$(document).rea ...
- Vue method与computed的区别
为了说明method与computed的区别,在此我想先来看看computed属性在vue官网中的说法: 模板内的表达式是非常便利的,但是它们实际上只用于简单的运算.在模板中放入太多的逻辑会让模板过重 ...
- 【JavaScript】JS_Object跟Function的区别
JS_Object和Function的区别 我们本次的解释,主要通过下图 粗看该图,估计你不一定能看明白.不过接下来让我逐行向你解释. 最左侧:意思是,有两个对象f1和f2,他们是通过new Foo( ...
- 【jQuery 区别】.click()和$(document).on("click","指定的元素",function(){});的区别
给出以下的代码展示: //绑定 下一页 的点击事件 $("a[aria-label='Next']").click(function(){ $("a[aria-label ...
- JavaScript中函数function fun(){}和 var fun=function(){}的区别
function fun(){} 和 var fun=function(){}的区别 标题有点长···· 废话少说,其实他们的主要区别就是"函数声明的提前行为". var fun= ...
- $("#XXX").click()和$("#YYY").on("click","指定的元素",function(){});的区别(jQuery动态绑定事件)
//绑定 下一页 的点击事件 $("a[aria-label='Next']").click(function(){ $("a[aria-label='Previous' ...
- 15. window.onload和$(function() { } )的区别
window.onload和$(function() { } )的区别 1)执行时机不一样 $(function() { } )是在dom结构创建完成以后就执行,window.onload是在整个页面 ...
随机推荐
- Spring mvc源码url路由-我们到底能走多远系列(38)
我们到底能走多远系列38 扯淡: 马航的事,挺震惊的.还是多多珍惜身边的人吧. 主题: Spring mvc 作为表现层的框架,整个流程是比较好理解的,毕竟我们做web开发的,最早也经常接触的就是一个 ...
- JS基础知识(-)
1 , call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法 ...
- 单元测试-代码覆盖率工具 -- JaCoCo
最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. 随着敏捷开发的流行,编写单元测试已经成为业界共识.但如何来衡量单元测试的质量呢?有些管理者片面追求单元 ...
- 移动互联网实战--Apple的APNS桩推送服务的实现(2)
前记: 相信大家在搞IOS推送服务的开发时, 会直接使用javapns api来简单实现, 调试也直连Apple的APNS服务(产品/测试版)来实现. 很少有人会写个APNS的桩服务, 事实也是如此. ...
- ZOJ 1115 Digital Roots
原题链接 题目大意:给一个数字,每一位相加求和,不断重复过程,直到剩一位数字. 解法:考虑到输入的数字可以很大,把输入按照字符串格式读入,再逐位处理. 参考代码: #include <iostr ...
- 基于时间延迟的Python验证脚本
自己写的一段Python脚本,经常拿来验证一些sqlmap等工具跑不出数据的网站. GET类型: import urllib import urllib2 import time payloads = ...
- 关于freemarker标签+Spring3.0 V层学习
import标签 就是把其他的ftl页面引用进来 <#import "/common/ui.ftl" as ui> 使用时 <@ui.message/>,m ...
- Python简史
Python简史 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python是我喜欢的语言,简洁,优美,容易使用.前两天,我很激 ...
- php支付接口,代付、感悟
支付接口: 1.验证用户登录信息 2.验证参数.用加密串来匹配,开信息是否被篡改 3.如果有必要可以仿造购物城 建立购物车列表 4.建立和请求方的关联表 5.进行订单生成.支付流程.各种判断.验证. ...
- 【NOIP2010】引水入城
以前一直以为是什么高端DP,看了题解才发现是水题,老是这样看题解才能写出来到赛场上怎么办嘛QAQ 原题: 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好 ...