Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Scala能被看作是';抽象反转';?_Oop_Scala_Programming Languages_Functional Programming_Abstraction - Fatal编程技术网

Oop Scala能被看作是';抽象反转';?

Oop Scala能被看作是';抽象反转';?,oop,scala,programming-languages,functional-programming,abstraction,Oop,Scala,Programming Languages,Functional Programming,Abstraction,您好 这是一个具有挑衅性的问题,旨在就开发人员社区如何看待抽象反转展开辩论。我真想知道你的想法 首先,这里引用了维基百科提供的抽象反转示例:

您好

这是一个具有挑衅性的问题,旨在就开发人员社区如何看待抽象反转展开辩论。我真想知道你的想法

首先,这里引用了维基百科提供的抽象反转示例:

<创建一个对象来表示一个函数在面向对象语言(如java和C++)中是繁琐的,其中函数不是一流对象。在C++中,通过重载()操作符可以使对象“可调用”,但仍然需要实现一个新的类,例如STL中的函子。 对我来说,函数是Scala中的一级公民,但当我们使用Scala生成Java字节码时,Scala会在Java的“顶部”创建特定的类,使函数编程成为可能我们能把这看作是一种抽象反转吗?

这同样适用于Clojure或JVM的任何函数语言。。。甚至Apache集合,例如:



顺便说一句,我不相信维基百科文章的客观性。例如,当谈到微核中可能的抽象反转时,文章说“一种观点认为微核设计是一种抽象反转”,但在OOP中没有关于函数类型的这样的陈述不,它不能被视为抽象反转。原因很简单:在Scala中,您可以选择您喜欢的抽象级别。大多数情况下,写作更方便

val f = 2 * (_:Int)
//--> f: (Int) => Int = 

f(21)
//--> res5: Int = 42
但是,用“长”的方法来做是没有问题的:

FunctionN是特性,可以在继承中使用混合,这样就可以避免像C++中的仿函数一样的情况。例如,您可以将Java映射作为一项功能进行“改装”:

class JavaMap[K,V] extends java.util.HashMap[K,V] with Function1[K,V] {
    def apply(k:K) = get(k)
}

val m = new JavaMap[Int, String]
m.put(5,"five")
m(5)
//--> res8: String = five

通过一个对象实现一个函数并不简单,因为这在JVM上是可能的,它直接切入了Scala的基本原理

所有内容都是一个对象:函数、参与者、数字文本等。任何对象都可以应用(通过定义
apply()
方法),而不需要实际作为FunctionN的子类

这种二元性是许多标准库API设计的基础,它允许将映射视为函数(将键映射到值)和对象(键/值对的集合)


Scala是一个真正的对象/功能混合体,两种范式都不占主导地位。

这篇wiki文章真的很弱(它本身是否代表了一种抽象反转?:),而且这个概念本身有点可疑。但它的基本要点似乎是抽象隐藏了一些基本元素,迫使该抽象的用户重新实现它

例如,在talk页面上有一个更有趣的例子。假设一个CPU有一个
tan
数学函数,但没有
sin
cos
,一种编程语言实现了
sin
cos
,但没有暴露
tan
本身。使用该语言的程序员将被迫按照
sin
cos
实现
tan
,而这两种语言本身就是按照
tan
实现的,因此具有抽象反转的特征

那么,回到斯卡拉。当然,在Scala中使用函数的程序员不会产生抽象反转,因为他不会被迫重新实现Scala的原语功能

另一方面,有人可能会说Scala将函数实现为类实例是抽象反转的实例。然而,要做到这一点,必须有两件事是正确的:

  • JVM必须有一个可用的“函数”原语
  • 这样一个原语一定为Scala的工作提供了另一种选择
  • 函数究竟是什么?函数原语是什么样子的?在此上下文中,“函数”指能够被执行的数据。有人可能会说,事实上,所有汇编代码都是能够执行的数据——只是它不可移植,而且不是字节码,因此不符合设计原则

    另一方面,Java中的所有方法都由一个标识符引用,Java通过该标识符定位要为给定对象的类层次结构执行的代码。此标识符不公开,但可以通过反射间接使用。如果它是公开的,并且提供了一些功能来表示“调用此代码”,那么可以围绕它构建一个函数

    所以,我认为可以证明1是真的。让我们继续下一步

    如果Java确实提供了“方法”数据类型,Scala函数会不再是类的实例吗?不,他们不会。Scala的一个基本设计方面是,运行程序的每个元素都是一个对象。Java已经拥有的“原语”被表示为具有方法的普通对象,如果有“方法”原语,它也会这样


    方法原语的一个可能结果是将方法提升为一等公民,但函数本身几乎不会改变。

    我认为不会。在Scala中实现一流函数的方法就是实现细节。

    你的方法就是这样!!+1000用于深入理解问题,给出非常详细的答案,以及。。成为一名免费的BSD提交者!非常感谢,我同意这篇文章纯粹是废话。。。必须重写或删除。
    class JavaMap[K,V] extends java.util.HashMap[K,V] with Function1[K,V] {
        def apply(k:K) = get(k)
    }
    
    val m = new JavaMap[Int, String]
    m.put(5,"five")
    m(5)
    //--> res8: String = five