gpt4 book ai didi

scala - 为什么要区分 Scala 中的方法和函数?

转载 作者:行者123 更新时间:2023-12-04 23:27:57 25 4
gpt4 key购买 nike

我一直在阅读 Scala 中的方法和函数。吉姆的 post和丹尼尔的 complement它很好地解释了这些之间的区别。这是我随身携带的:

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

  • 我也明白 def 的区别, valvar .

    现在我实际上有两个问题:
  • 为什么我们不能参数化一个函数的apply方法来参数化这个函数?和
  • 为什么不能被函数对象调用的方法运行得更快?还是让函数的调用者直接调用原始方法?

  • 期待您的回答,并提前致谢!

    最佳答案

    1 - 参数化功能。
    理论上编译器可以参数化函数的类型;人们可以将其添加为一项功能。然而,这并非完全无关紧要,因为函数的参数是逆变的,而返回值是协变的:

    trait Function1[+T,-R] { ... }
    这意味着另一个可以接受更多参数的函数算作一个子类(因为它可以处理父类(super class)可以处理的任何东西),如果它产生更小的结果集,那没关系(因为它也将遵守父类(super class)的构造方式) )。但是你如何编码
    def fn[A](a: A) = a
    在那个框架里?重点是返回类型等于传入的类型,无论该类型必须是什么。你需要
    Function1[ ThisCanBeAnything, ThisHasToMatch ]
    作为您的函数类型。 Any 很好地代表了“这可以是任何东西”如果你想要一个单一的类型,但是当原始类型丢失时你可以返回任何东西。这并不是说没有办法实现它,而是它不能很好地适应现有框架。
    2 - 功能的速度。
    这真的很简单:一个函数是 apply另一个对象的方法。您必须拥有该对象才能调用其方法。这总是比调用你自己的方法慢(或至少不会快),因为你已经有了自己。
    实际上,现在 JVM 可以很好地内联函数。只要您主要使用您的方法或函数,而不是一遍又一遍地创建函数对象,性能通常没有区别。如果您深度嵌套非常短的循环,您可能会发现自己创建了太多函数;将它们移到嵌套循环之外的 val 中可以节省时间。但是,在您进行基准测试并知道那里存在瓶颈之前,请不要打扰;通常 JVM 会做正确的事情。

    关于scala - 为什么要区分 Scala 中的方法和函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9440722/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com