加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么在Scala中区分方法和函数?

发布时间:2020-12-16 18:07:49 所属栏目:安全 来源:网络整理
导读:我一直在阅读 Scala中的方法和函数. Jim的 post和Daniel的 complement很好地解释了它们之间的差异.这是我带给我的东西: 函数是对象,方法不是; 因此,函数可以作为参数传递,但方法不能; 方法可以是类型参数化,函数不能; 方法更快. 我也理解def,val和var之间的
我一直在阅读 Scala中的方法和函数. Jim的 post和Daniel的 complement很好地解释了它们之间的差异.这是我带给我的东西:

>函数是对象,方法不是;
>因此,函数可以作为参数传递,但方法不能;
>方法可以是类型参数化,函数不能;
>方法更快.

我也理解def,val和var之间的区别.

现在我实际上有两个问题:

>为什么我们不能参数化函数的apply方法来参数化函数?和
>为什么函数对象不能调用该方法才能更快地运行?或者函数的调用者直接调用原始方法?

期待您的回答,并提前多多感谢!

解决方法

1 – 参数化功能.

理论上,编译器可以参数化函数的类型;可以将其添加为功能.然而,这并非完全无足轻重,因为函数在它们的参数中是逆变的,并且它们的返回值是协变的:

trait Function1[+T,-R] { ... }

这意味着可以接受更多参数的另一个函数计为子类(因为它可以处理超类可以处理的任何内容),如果它产生一组较小的结果,那就没关系(因为它也会遵循这样的超类构造) ).但你怎么编码

def fn[A](a: A) = a

在那个框架中?重点是返回类型等于传入的类型,无论该类型必须是什么.你需要

Function1[ ThisCanBeAnything,ThisHasToMatch ]

作为你的功能类型.如果你想要一个类型,那么“这可以是任何东西”由Any完美表示,但是当原始类型丢失时你可以返回任何东西.这并不是说没有办法实现它,但它并不适合现有的框架.

2 – 功能速度.

这很简单:函数是另一个对象的apply方法.您必须拥有该对象才能调用其方法.这比调用自己的方法总是慢(或至少没有更快),因为你已经有了自己.

实际上,JVM现在可以很好地完成功能的编写工作;只要你主要使用你的方法或函数,而不是一遍又一遍地创建函数对象,性能通常没有差别.如果你深深地嵌套非常短的循环,你可能会发现自己创造了太多的功能;将它们移出嵌套循环外的val可以节省时间.但是,在你进行基准测试并知道那里存在瓶颈之前不要打扰;通常JVM做正确的事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读