2010-08-07 46 views

回答

34

取决于你所说的“一切”是什么。正如其他人已经证明的那样。类也是类Class的实例。方法,操作符和块不是,但可以用对象包装(Proc)。简单的任务不是,也不是。像while这样的声明也不是也不能。后者显然也有评论。

实际上重要的事情,即您希望操纵的东西是对象(或可以包装在对象中)。

+1

+1喜欢这些反例。说一切都是一个对象,没有考虑所有事情都会被轻度洗脑:) – Jakob 2010-08-07 09:44:45

+0

+1 - 这是我在其他一些问题中想说的,这个问题已经从中产生了。 – RubyDubee 2010-08-10 07:52:45

+0

为什么不是'while'对象? – Ziggy 2014-06-12 22:46:04

1

烨。

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

要查看继承链:

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

'#ancestors'也提供了所有包含的模块,而不仅仅是继承链。 – jtbandes 2010-08-07 07:40:08

+0

此外,'pp'默认情况下不可用,至少在1.8.7p174。 – jtbandes 2010-08-07 07:42:44

+0

是的,我知道!谢谢。 – Dex 2010-08-07 11:34:10

4

是。 Fixnum是一类,它从Integer继承,它从Numeric,其最终从Object继承继承。

或者说,为什么你不问吗? :)

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

Ruby infodocumentation在网站上是非常好的方法。

2

红宝石doen't有任何原语(如int,焦炭等在Java),所以每一个值(任何可以坐在赋值语句的右侧)是一个对象。但是,语言语法的控制语句,方法和其他功能不是。

4

实际上一切在Ruby是一个对象,具有控制结构的异常。无论是在方法,代码块还是操作符之下,它们都被表示为对象,并且可以这样认为。

以一个码块,例如:

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

> what_is {} 
Proc 
true 
=> nil 

或为一个方法:

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..." 

和运营商(例如+, - ,[],< <)被实现为方法:

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

对于第一次进入编程的人来说,这是什么意思在ap从逻辑上讲,所有适用于某种对象的规则都可以扩展到其他规则。您可以将您定义的字符串,数组,类,文件或任何类视为以非常相同的方式运行。这是Ruby比其他语言更易于使用和使用的原因之一。