我一直在阅读Scala中的方法和函数.吉姆的帖子和丹尼尔的补充很好地解释了这些之间的差异.这是我带给我的东西:
我也明白之间的差别def,val和var.
现在我实际上有两个问题:
期待您的回答,并提前多多感谢!
理论上,编译器可以参数化函数的类型; 可以将其添加为功能.然而,这并非完全无足轻重,因为函数在它们的参数中是逆变的,并且它们的返回值是协变的:
trait Function1[+T,-R] { ... }
Run Code Online (Sandbox Code Playgroud)
这意味着可以接受更多参数的另一个函数计为子类(因为它可以处理超类可以处理的任何内容),并且如果它生成一组较小的结果,那就没关系(因为它也会遵循超类构造的方式) ).但你怎么编码
def fn[A](a: A) = a
Run Code Online (Sandbox Code Playgroud)
在那个框架中?重点是返回类型等于传入的类型,无论该类型必须是什么.你需要
Function1[ ThisCanBeAnything, ThisHasToMatch ]
Run Code Online (Sandbox Code Playgroud)
作为你的功能类型.Any如果你想要一个类型,那么"这可以是任何东西"都可以很好地表示,但是当原始类型丢失时你可以返回任何东西.这并不是说没有办法实现它,但它并不适合现有的框架.
这很简单:函数是apply另一个对象的方法.您必须拥有该对象才能调用其方法.这比调用自己的方法总是慢(或至少没有更快),因为你已经有了自己.
实际上,JVM现在可以很好地完成功能的编写工作; 只要你主要使用你的方法或函数,而不是一遍又一遍地创建函数对象,性能通常没有差别.如果你深深地嵌套非常短的循环,你可能会发现自己创造了太多的功能; 将它们移出嵌套循环外的val可以节省时间.但是,在你进行基准测试并知道那里存在瓶颈之前不要打扰; 通常JVM做正确的事情.