方法类型没有值。我们如何评估一个方法?
以SML为例,我有
fun myFunc(x) = x + 5
val b = myFunc(2)
在第二个表达式中,myFun
有一个类型和一个值,我们使用它的类型进行类型检查,并使用它的值和它的参数一起计算b
的值>
但是在没有值的 Scala 方法中我们如何评估?我对 Scala 还很陌生,所以可能不是很清楚。
def myFunc(x) = x + 5
val b = myFunc(2)
从val b = myFunc(2)
到val b = 2 + 5
,中间发生了什么?我们从哪里或什么对象知道 myFunc(x)
是 x + 5
?
谢谢!!
最佳答案
简单的答案是:仅仅因为方法不是“可以由你操纵的东西”意义上的值,并不意味着它不是某种意义上的值“编译器的作者可以操纵的东西”。
当然,方法将有一个在编译器内部表示它的对象。事实上,该对象可能看起来与表示 MLton SML 编译器或 SML/NJ 等内部函数的对象非常相似。
在 SML 中,语法不是一个值,但您也不会质疑如何编写函数调用,不是吗?毕竟,为了在 SML 中调用函数,我需要使用函数调用语法编写函数调用,那么当语法不是值时我该怎么做呢?
嗯,答案是一样的:仅仅因为语法不是程序员可以操纵的值,编译器(或更准确地说是解析器)显然>知道语法。
我无法告诉你为什么决定让 Scala 中的函数为值而不是方法,但我可以猜测一下。 Scala 是一种面向对象的语言。在面向对象的语言中,每个值都是一个对象,每个对象都有绑定(bind)到该对象的方法。因此,如果方法是对象,那么它们就需要有方法,方法是对象,方法有方法,方法是对象,依此类推。
当然有很多方法可以解决这个问题,但这会使语言变得更加复杂。出于类似的原因,类不是对象(与 Smalltalk、Python 和 Ruby 中的对象不同)。请注意,即使在像 Ruby 这样高度反射(reflection)、内省(introspection)、动态的语言中,方法也不是对象。类是,但不是方法。
可以使用反射来获取代表方法的代理对象,但该对象不是方法本身。实际上,您也可以在 Scala 中执行相同的操作。
当然,可以通过 η 扩展将方法转换为函数值。
关于scala - Scala 中如何评估方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63856674/