2010-08-07 21 views

Respuesta

34

Depende de lo que quiere decir con "todo". Fixnum s, como los otros lo han demostrado. Las clases también son, como instancias de la clase Class. Los métodos, operadores y bloques no son, pero pueden ser envueltos por objetos (Proc). La asignación simple no es, y no puede. Las declaraciones como while tampoco son ni pueden. Los comentarios obviamente también caen en el último grupo.

La mayoría de las cosas que en realidad materia, es decir, que desea manipular, son objetos (o pueden envolverse en objetos).

+1

+1 Me encantan estos contraejemplos. Decir que todo es un objeto sin considerar TODO, es un poco lavado de cerebro :) – Jakob

+0

+1 - Magnífico eso es lo que estaba tratando de decir en alguna otra pregunta, a partir de la cual se ha generado esta pregunta. – RubyDubee

+0

¿Por qué no es 'while' un objeto? – Ziggy

1

Sip.

> Fixnum.is_a?(Object) #=> true 

Para ver la cadena de herencia:

> pp Fixnum.ancestors 
[Fixnum, 
Integer, 
Precision, 
Numeric, 
Comparable, 
Object, 
    ... 
Kernel] 
=> nil 
+0

'# ancestros' también ofrece todos los módulos incluidos, no solo la cadena de herencia. – jtbandes

+0

Además, 'pp' no está disponible por defecto, al menos en 1.8.7p174. – jtbandes

+0

Sí, lo sé! Gracias. – Dex

4

Sí. Fixnum es una clase que hereda de Integer, que hereda de Numeric, que finalmente hereda de Object.

O, ¿por qué no lo preguntas? :)

1.is_a? Object # => true 
1.class # => Fixnum 
Fixnum.is_a? Object # => true 

Lectura de la Ruby info y documentation en el sitio web es una buena idea también.

2

Ruby no tiene ninguna primitiva (como int, char, etc. en java), por lo que cada valor (cualquier cosa que pueda sentarse a la derecha de una declaración de asignación) es un objeto. Sin embargo, las instrucciones de control, los métodos y otras características de la sintaxis del lenguaje no lo son.

4

Prácticamente todo en Ruby es un objeto, con la excepción de las estructuras de control. Independientemente de si un método, bloque de código u operador es o no es un Objeto, se representan como Objetos y pueden considerarse como tales.

Tomar un bloque de código, por ejemplo:

def what_is(&block) 
    puts block.class 
    puts block.is_a? Object 
end 

> what_is {} 
Proc 
true 
=> nil 

O para un Método:

class A 
    def i_am_method 
    "Call me sometime..." 
    end 
end 

> m = A.new.method(:i_am_method) 
> m.class 
Method 
> m.is_a? Object 
true 
> m.call 
"Call me sometime..." 

Y los operadores (como +, -, [], < <) se implementan como métodos:

class String 
    def + 
    "I'm just a method!" 
    end 
end 

Para las personas que ingresan a la programación por primera vez, lo que esto significa en ap El sentido racional es que todas las reglas que puede aplicar a un tipo de objeto se pueden extender a otros. Puede pensar en una cadena, matriz, clase, archivo o cualquier clase que defina como comportándose de la misma manera. Esta es una de las razones por las que Ruby es más fácil de aprender y trabajar que algunos otros idiomas.

Cuestiones relacionadas