除了Python以外,哪些语言有明确的自我?

时间:2009-12-08 07:33:23

标签: python programming-languages

Python要求您显式传递self作为所有类函数的第一个参数,这似乎有点奇怪。还有其他语言需要类似的东西吗?

8 个答案:

答案 0 :(得分:5)

通过显式,你的意思是“明确地作为参数传递给每个类函数”? 如果是这样,那么Python就是我唯一知道的。

大多数OO语言以某种形式支持thisself,但大多数语言都允许您定义类函数,而无需始终将self定义为第一个参数。

答案 1 :(得分:4)

根据你的观点,Lua。引用引用:“调用v:name(args)是v.name(v,args)的语法糖,除了v只计算一次。”您还可以使用两种表示法定义方法。所以你可以说Lua有一个可选的显式自我。

答案 2 :(得分:4)

编程语言Oberon 2有一个明确的名为但没有为类的成员函数显式传递'this'或'self'参数(在Oberon术语中称为类型绑定过程)

以下示例是Text类型的Insert方法,其中指定标识符't'以绑定到显式'this'或'self'引用。

PROCEDURE (t: Text) Insert (string: ARRAY OF CHAR; pos: LONGINT);
BEGIN ...
END Insert;

有关Oberon中面向对象的详细信息,请here

答案 3 :(得分:3)

F#(可能来自其OCAML遗产)要求所有自我引用的明确名称;虽然名称是任意标识符,例如

 override x.BeforeAnalysis() = 
    base.BeforeAnalysis()
    DoWithLock x.AddReference

这里我们定义了一个重写成员函数BeforeAnalysis,它调用另一个成员函数AddReference。这里的标识符x是任意的,但在声明和对“this”/“self”实例的成员的任何引用中都是必需的。

答案 4 :(得分:2)

Modula-3。这并不太令人惊讶,因为Python的类机制是a mixture of the ones found in Modula-3 and C++

答案 5 :(得分:1)

任何Object-Oriented language在成员函数中都有这个或自我的概念。

答案 6 :(得分:0)

许多面向对象的语言(如果不是全部的话)

例如c ++支持“this”而不是“self”

但你不必通过它,它被动地传递

希望有所帮助;)

答案 7 :(得分:0)

Clojure不是OOP语言,但在某些情况下确实使用显式自我参数:最明显的是当你实现一个协议时,“self”参数(你可以将它命名为你喜欢的任何东西)是第一个协议方法的参数。然后将该参数用于多态分派以确定正确的函数实现,例如:

(defprotocol MyProtocol
  (foo [this that]))

(extend-protocol MyProtocol String
  (foo [this that]
    (str this " and " that)))

(extend-protocol MyProtocol Long
  (foo [this that]
    (* this that)))

(foo "Cat" "Dog")
=> "Cat and Dog"

(foo 10 20)
=> 200

此外,函数的第一个参数通常用于表示正在作用的对象,例如,以下代码附加到向量:

(conj [1 2 3] 4)
=> [1 2 3 4]