2010-06-24 12 views
10

Entonces, tengo curiosidad sobre cómo Ruby es un lenguaje completamente orientado a objetos. Me tropiezo con un problema que no es muy claro para mí.¿Cómo está Ruby completamente orientado a objetos?

Si defino una función de la siguiente manera

def foo(text) 
    print text 
end 

y defino la función fuera de una clase, ¿cómo es esta función un objeto? Me doy cuenta de que puedo llamar al

foo.class 

Y obtengo NilClass. ¿Esto significa que foo es una instancia de NilClass? Y si lo es, ¿qué significa exactamente cuando llamo

foo "hello world" 

Si foo es un objeto, el método que estoy llamando cuando hago la declaración que el anterior. Además, si un objeto, ¿significa que puedo modificarlo y añadir otro método a la misma (por ejemplo bar) en el que podía posiblemente hacer la siguiente DECLARACIÓN:

foo.bar(some variables) 

Lo siento, estoy un poco confundido en este punto. Cualquier aclaración es muy apreciada! ¡Gracias!

+1

posible duplicado de [Métodos en Ruby: ¿objetos o no?] (Http://stackoverflow.com/questions/2602340/methods-in-ruby-objects-or-not) – OscarRyz

Respuesta

12
  • de usuario definidos funciones globales (funciones de nivel superior) son los métodos de instancia de Object (a pesar de que la clase de self no es Object).
  • Los métodos de nivel superior son siempre privados.
+2

bien, eso tiene sentido. Entonces las funciones no son objetos, sino métodos privados de la clase Object. ¡Gracias! –

11

Como Wikipedia states:

Todos los métodos definidos fuera del alcance de un objeto en particular son en realidad métodos de la clase Object.

Ruby es en realidad "multi-paradigma". Admite paradigmas orientados a objetos, funcionales, imperativos (y algunos otros).

Ser "totalmente orientado a objetos" no significa que solo es compatible con el paradigma orientado a objetos. Siempre y cuando admita todas las características que conforman la programación orientada a objetos (clases, instancias, polimorfismo, etc.), puede seguir soportando los paradigmas adicionales y seguir estando "totalmente orientados a objetos".

+0

Entonces, ¿eso significaba que la siguiente sería válido: o = Object.new o.foo ?? (después de definir el objeto foo, por supuesto) –

+0

Y entiendo lo que significa "totalmente orientado a objetos" (al menos estoy bastante seguro), pero eso no significa que TODO debería ser un objeto. Entonces, mi pregunta no es si Ruby puede usarse para varios paradigmas, sino que desde una perspectiva de objeto son objetos de métodos y, de ser así, qué implica eso. –

+0

No, no lo son. Ver: http://stackoverflow.com/questions/2602340/methods-in-ruby-objects-or-not –

7

foo.class primeros llama al método foo, que devuelve nil, y después llama al método class en el objeto de regresar de foo, a saber nil.

En la notación de pseudocódigo, evaluando el código paso a paso:

foo.class 
==> { print text }.class 
==> { nil }.class 
==> nil.class 
==> NilClass 
0

Para ampliar el ejemplo de Justicia, se puede tomar esto aun más lejos.

def foo 
    puts "foo" 
end 

foo.class 
==> NilClass 
NilClass.class 
==> Class 
Class.superclass 
==> Module 
Module.superclass 
==> Object 
Object.superclass 
==> BasicObject 

Todo es una instancia de la clase BasicObject como mínimo.

+0

mi ruby ​​1.8.7 muestra 'nil' cuando' Object.superclass' – ohho

2

Puede obtener un método como un objeto.Para utilizar el ejemplo:

def foo(text) 
    print text 
end 

y expanda sobre ella:

method_as_object = method(:foo) 
method_as_object.call('bar') #=> bar 

Por lo general, sin embargo, cuando se define un método, que acaba de definir como un método para el ámbito actual (que es por defecto la clase Object)

Cuestiones relacionadas