考虑到Ruby中的所有内容都是一个对象,我们可以打开irb并输入4.class
和"Text".class
之类的内容来查看对象是哪个类,为什么if.class
和{{ 1}}没有返回值?
答案 0 :(得分:10)
考虑到Ruby中的所有内容都是一个对象
这取决于您对“ object ”和每个 - “ thing ”的定义。 “对象”可以表示“可以由程序操作的实体”(我将从现在开始称之为对象)或“< em>作为对象系统成员的值“(从现在开始我将称之为Object
。)
在Ruby中,程序可以操作的所有内容(即每个对象)也是Object
,即类的实例。这与Java不同,例如, primitives 可以由程序操作(即在该词的意义上对象),但不是{{1} }。在Ruby中,这种区别不存在:每个对象都是Objects
,每个Object
也是对象。
但是,语言中有的东西,不能被程序操纵,哪些不是类的实例,即它们都不是对象 s和Object
。例如,这些是方法,变量,语法,参数列表,参数列表,关键字。
注意:您可以使用Ruby的反射API为您提供表示方法或参数列表的对象,但该对象只是一个代理,它不是真实的。
所以,当我们说“一切都是对象”时,我们真正的意思是“每个对象都是Object
”,即一切可以由程序操纵的也是对象系统的成员,或者换句话说,在对象系统之外没有值(与Java中的原语不同)。我们 not 意味着该语言中存在的所有内容也可以在程序运行时进行操作。
为什么
Object
和if.class
没有给出返回值
好吧,首先,即使如果 unless.class
是一个对象,那些也不会按照您的想法行事:当您说{{在Ruby中,它意味着“取消引用局部变量if
”或“使用foo
调用方法foo
作为隐式接收器而不是参数列表”。所以,
foo
将通过方法{{1}为您提供由本地变量self
引用的引用对象的类,或者通过方法{{1}为您提供返回的对象的类 },但永远 if.class
本身的类。
但if
控制流关键字不是一个对象(无论是对象还是if
),因为关键字和控制流不是Ruby中的对象
第2页上的The Ruby Programming Language by Matz and David Flanagan一书中提到:
每个值都是一个对象
注意,它并不是说每个事物,只是每个值。
答案 1 :(得分:4)
因为它们是语言关键字而不是对象。通常,您可以分配给变量的所有内容都是对象。
技术上是正确的:unless
等关键字可能具有编译器/解释器使用的类(取决于实际实现),但作为语言用户,对它没有任何远程实际用途,所以它不会暴露给你。
答案 2 :(得分:1)
1.9.2-p320 :019 > def meth
1.9.2-p320 :020?> 'meth'
1.9.2-p320 :021?> end
=> nil
1.9.2-p320 :022 >
如果您观察到问号和缩进,当IRB检测到需要延续的内容时,它会缩进。
1.9.2-p320 :022 > if.class
1.9.2-p320 :023?> ...
1.9.2-p320 :028?> end
SyntaxError: (irb):22: syntax error, unexpected '.'
if.class
^
(irb):28: syntax error, unexpected keyword_end, expecting $end
1.9.2-p320 :045 > if.if
1.9.2-p320 :046?> end
SyntaxError: (irb):45: syntax error, unexpected '.'
if.if
^
1.9.2-p320 :060 > str = 'abc'
=> "abc"
1.9.2-p320 :061 > str.
1.9.2-p320 :062 > length
=> 3
1.9.2-p320 :063 >
1.9.2-p320 :083 > if
1.9.2-p320 :084 > str
1.9.2-p320 :085?> puts '>>>'
1.9.2-p320 :086?> end
>>>
=> nil
1.9.2-p320 :087 >
正如您所看到的,即使存在明显的错误,例如向保留字发送消息,IRB也不会立即回答。的?是等待声明其余部分的标志。