¿Qué son los objetos de “primera clase”?

¿Cuándo se dice que los objetos o algo más son “primera clase” en un lenguaje de progtwigción determinado, y por qué? ¿En qué se diferencian de las lenguas donde no están?

EDITAR. Cuando uno dice “todo es un objeto” (como en Python), ¿quiere decir que “todo es de primera clase”?

En resumen, significa que no hay restricciones en el uso del objeto. Es lo mismo que cualquier otro objeto.

Un objeto de primera clase es una entidad que se puede crear, destruir, pasar a una función dinámicamente, devolver como un valor y tener todos los derechos que tienen otras variables en el lenguaje de progtwigción.

Dependiendo del idioma, esto puede implicar:

  • Ser expresable como un valor literal anónimo.
  • ser almacenable en variables
  • ser almacenable en estructuras de datos
  • tener una identidad intrínseca (independiente de cualquier nombre)
  • Ser comparables para la igualdad con otras entidades.
  • ser pasable como parámetro a un procedimiento / función
  • siendo retornable como resultado de un procedimiento / función
  • ser construible en tiempo de ejecución
  • siendo imprimible
  • siendo legible
  • Ser transmisible entre procesos distribuidos.
  • ser almacenables fuera de los procesos en ejecución

Fuente

En C ++, las funciones en sí mismas no son objetos de primera clase, sin embargo:

  • Puede anular el operador ‘()’ haciendo que sea posible tener una función de objeto, que es de primera clase.
  • Los punteros de función son de primera clase.
  • boost bind, lambda y function ofrecen funciones de primera clase

En C ++, las clases no son objetos de primera clase, pero sí las instancias de esas clases. En Python, tanto las clases como los objetos son objetos de primera clase. (Vea esta respuesta para más detalles sobre las clases como objetos).

Aquí hay un ejemplo de las funciones de primera clase de Javascript:

// f: function that takes a number and returns a number // deltaX: small positive number // returns a function that is an approximate derivative of f function makeDerivative( f, deltaX ) { var deriv = function(x) { return ( f(x + deltaX) - f(x) )/ deltaX; } return deriv; } var cos = makeDerivative( Math.sin, 0.000001); // cos(0) ~> 1 // cos(pi/2) ~> 0 

Fuente

Las entidades que no son objetos de primera clase se denominan objetos de segunda clase. Las funciones en C ++ son de segunda clase porque no pueden crearse dinámicamente.

Respecto a la edición:

EDITAR. Cuando uno dice “todo es un objeto” (como en Python), ¿quiere decir que “todo es de primera clase”?

El término objeto se puede usar a la ligera y no implica ser de primera clase. Y probablemente tendría más sentido llamar a todo el concepto ‘entidades de primera clase’. Pero en Python tienen el objective de hacer que todo sea de primera clase. Creo que la intención de la persona que hizo su statement fue de primera clase.

“Primera clase” significa que puede operar en ellos de la manera habitual. La mayoría de las veces, esto solo significa que puede pasar a estos ciudadanos de primera clase como argumentos a funciones, o devolverlos desde funciones.

Esto es evidente para los objetos, pero no siempre es tan evidente para las funciones, o incluso las clases:

 void f(int n) { return n * 2; } void g(Action a, int n) { return a(n); } // Now call g and pass f: g(f, 10); // = 20 

Este es un ejemplo en C # donde las funciones en realidad no son objetos de primera clase. Por lo tanto, el código anterior usa una pequeña solución (a saber, un delegado genérico llamado Action<> ) para pasar una función como un argumento. Otros idiomas, como Ruby, permiten tratar incluso las clases y los bloques de código como variables normales (o, en el caso de Ruby, constantes).

De una diapositiva en Estructura e interpretación de progtwigs de computadora , conferencia 2A (1986), que a su vez cita a Christopher Stracey :

Los derechos y privilegios de los ciudadanos de primera clase:

  • Ser nombrado por variables.
  • Pasar como argumentos a procedimientos.
  • Para ser devueltos como valores de trámites.
  • Para ser incorporado en las estructuras de datos.

“Cuando uno dice” todo es un objeto “(como en Python), ¿realmente quiere decir que” todo es de primera clase “?

Sí.

Todo en Python es un objeto propio. Incluso las cosas que son “tipos primitivos” en otros idiomas.

Encuentras que un objeto como 2 realidad tiene una interfaz bastante rica y sofisticada.

 >>> dir(2) ['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__str__', '__sub__', '__truediv__', '__xor__'] 

Debido a que todo es un objeto de primera clase en Python, hay relativamente pocos casos especiales oscuros.

En Java, por ejemplo, hay tipos primitivos (int, bool, double, char) que no son objetos adecuados. Es por eso que Java tiene que introducir Integer, Boolean, Double y Character como tipos de primera clase. Esto puede ser difícil de enseñar a los principiantes, no es obvio por qué tanto un tipo primitivo como una clase tienen que existir lado a lado.

También significa que la clase de un objeto es, en sí misma, un objeto. Esto es diferente de C ++, donde las clases no siempre tienen una existencia distinta en tiempo de ejecución.

El tipo de 2 es el objeto de type 'int' , que tiene métodos, atributos y un tipo.

 >>> type(2)  

El tipo de un tipo incorporado como int es el objeto de type 'type' . Esto tiene métodos y atributos, también.

 >>> type(type(2))  

En mi opinión, esta es una de esas metáforas utilizadas para describir cosas en un lenguaje natural. El término se usa esencialmente en el contexto de describir funciones como objetos de primera clase.

Si considera un lenguaje orientado a objetos, podemos impartir varias características a los objetos, por ejemplo: herencia, definición de clase, capacidad para pasar a otras secciones de código (argumentos del método), capacidad para almacenar en una estructura de datos, etc. Si podemos hacer el Lo mismo ocurre con una entidad que normalmente no se considera como un objeto, como las funciones en el caso de un script java, tales entidades se consideran objetos de primera clase.

La primera clase aquí esencialmente significa, no manejada como segunda clase (con comportamiento degradado). Esencialmente la burla es perfecta o indistinguible.