2009-05-27 14 views
39

Si me quedo este archivo como "ruby x.rb ':¿Qué es "principal" en Ruby?

class X 
end 
x = X.new 

¿Qué es lo que se llama' X.new"?

¿Es un objeto/proceso/etc.?

+1

siento que esta pregunta podría beneficiarse del contexto de éste: http://stackoverflow.com/questions/916795 – mipadi

+3

Pregunta de la misma persona. LOL – Randolpho

Respuesta

46

Todo en Ruby ocurre en el contexto de algún objeto. El objeto en el nivel superior se llama "principal". Básicamente es una instancia de Object con la propiedad especial de que los métodos definidos allí se agregan como métodos de instancia de Object (para que estén disponibles en todas partes).

para que podamos hacer un guión compuesto enteramente de:

puts object_id 
@a = 'Look, I have instance variables!' 
puts @a 

y se imprimirá "105640" y "Mira, tengo las variables de instancia".

No es algo que generalmente deba preocuparse, pero está ahí.

+1

Algunas de las otras respuestas dicen que el "intérprete de ruby" llama al nuevo método. Pero creo que estás diciendo que hay un paso intermedio antes de que eso suceda. Y es que se crea una instancia de Object y toda la ejecución está mediada por ese objeto. En realidad, estoy tratando de completar los espacios en blanco sobre cómo se pasa el "nuevo" método como un mensaje al objeto X. Por lo que dices, parece que la principal (instancia de objeto) pasa el nuevo método como un mensaje a la instancia de X Class. ¿Me estoy acercando? – lorz

+0

Bueno, supongo que técnicamente puedes decir que es el intérprete de Ruby el que hace * todo *, ya que es lo que realmente ejecuta tu código. Pero desde el punto de vista del idioma, sí, su descripción parece exactamente correcta. En el nivel superior, cuando empiezas a escribir en Ruby, estás en el contexto de ese objeto. La mayoría de las personas no usan el nivel superior como un objeto, pero es uno. – Chuck

+2

Nota: Esta respuesta está un poco desactualizada. El método definido en el espacio de nombres 'main' ahora se agrega" mágicamente "a' BasicObject', que subclasifica 'Object' a partir de Ruby 1.9. – steel

3

Es la clase X. Usted está invocando el método "nuevo" que crea un objeto de la clase X. Por lo tanto, si ejecuta este texto como una secuencia de comandos, Ruby:

  • crea una nueva clase X que es una subclase del objeto, y la cual automáticamente (como una subclase de Object) hereda algunos métodos, de los cuales new es uno.
  • pone en marcha un nombre x
  • llama al método new en esa nueva clase X, la creación de un objeto de instancia de X; x obtiene una referencia a ese objeto.
+0

creo que se refiere a un punto de entrada de algún tipo. – Geo

2

Es la intérprete de Ruby correr la línea

x = X.new 

Al igual que con muchos lenguajes de script, el guión se interpreta de arriba hacia abajo en lugar de tener un método de punto de entrada estándar como la mayoría de los lenguajes compilados.

+0

Sí, creo que la persona que hizo esta pregunta se refería a 'main' desde la perspectiva de un programador de C.Todos los demás aquí parecen estar pensando en el objeto de primer nivel llamado 'main' en Ruby, que no es exactamente lo mismo. – Ajedi32

1

Como dijo Charlie Martin, X.new es una llamada al constructor en la clase X, que devuelve un objeto de tipo X, almacenado en la variable x.

Según su título, creo que está buscando un poco más. Ruby no necesita un main, ejecuta el código en el orden en que lo ve. Por lo tanto, las dependencias se deben incluir antes de llamarlas.

Así que su principal es cualquier código de estilo de procedimiento que se escribe fuera de una definición de clase o módulo.

+1

Haz ruby ​​-e "puts self". Imprimirá "principal". Es el objeto de contexto de nivel superior. – Chuck

+0

mi punto era simplemente que no declaras un método principal, como el cartel original parecía implicar en su pregunta. –

12

El llamador de nivel superior es un objeto principal, que es de clase Object.

probar este programa de rubí:

p self 
p self.class