什么是“if / unless”等等

时间:2012-12-12 10:30:29

标签: ruby oop irb

考虑到Ruby中的所有内容都是一个对象,我们可以打开irb并输入4.class"Text".class之类的内容来查看对象是哪个类,为什么if.class和{{ 1}}没有返回值?

3 个答案:

答案 0 :(得分:10)

  

考虑到Ruby中的所有内容都是一个对象

这取决于您对“ object ”和每个 - “ thing ”的定义。 “对象”可以表示“可以由程序操作的实体”(我将从现在开始称之为对象)或“< em>作为对象系统成员的值“(从现在开始我将称之为Object。)

在Ruby中,程序可以操作的所有内容(即每个对象)也是Object,即类的实例。这与Java不同,例如, primitives 可以由程序操作(即在该词的意义上对象),但不是{{1} }。在Ruby中,这种区别不存在:每个对象都是Objects,每个Object也是对象

但是,语言中有的东西不能被程序操纵,哪些不是类的实例,即它们都不是对象 s和Object。例如,这些是方法,变量,语法,参数列表,参数列表,关键字。

注意:您可以使用Ruby的反射API为您提供表示方法或参数列表的对象,但该对象只是一个代理,它不是真实的。

所以,当我们说“一切都是对象”时,我们真正的意思是“每个对象都是Object”,即一切可以由程序操纵的也是对象系统的成员,或者换句话说,在对象系统之外没有值(与Java中的原语不同)。我们 not 意味着该语言中存在的所有内容也可以在程序运行时进行操作。

  

为什么Objectif.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一书中提到:

  

每个值都是一个对象

注意,它并不是说每个事物,只是每个

另见问题Is variable is object in ruby?

答案 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也不会立即回答。的?是等待声明其余部分的标志。