什么是“if / unless”等等
考虑到Ruby中的所有东西都是一个对象,我们可以打开irb并输入像4.class
和"Text".class
这样的东西来查看一个对象是哪个类,为什么if.class
和unless.class
没有给出返回值?
考虑到Ruby中的所有内容都是一个对象
这取决于你对“ 对象 ”和每个“ 事物 ”的定义。 “ 对象 ”可以表示“ 可以由程序操纵的实体 ”(我将从现在开始称之为对象 ),或“ 作为对象系统成员的值 ”(我将从现在开始称之为Object
)。
在Ruby中,程序可以操作的所有东西(即每个对象 )也是一个Object
,即一个类的实例。 例如,这与Java不同,其中基元可以由程序操纵(即,在该意义上的对象 ),但不是Objects
。 在Ruby中,这种区别不存在:每个对象都是一个Object
,每个Object
也是一个对象 。
但是,语言中有些东西 不能被程序操纵,也不是类的实例,即它们既不是对象也不是Object
。 例如,这些是方法,变量,语法,参数列表,参数列表,关键字。
注意:您可以使用Ruby的reflectionAPI为您提供表示方法或参数列表的对象,但该对象只是一个代理,它不是真实的。
所以,当我们说“ 一切都是一个对象 ”时,我们真正的意思是“每个对象都是一个Object
”,即程序可以操作的所有东西也是对象系统的一个成员,换句话说,在对象系统之外没有值(与Java中的原语不同)。 我们并不是说该语言中存在的所有内容也可以在程序运行时进行操作。
为什么
if.class
和unless.class
没有给出返回值
好吧,首先,即使if 是一个对象,那些不做你认为他们做的事情:当你在Ruby中说foo
东西时,它意味着“取消引用局部变量foo
”或“用self
调用方法foo
”作为隐式接收者而没有参数列表“。 所以,
if.class
将为您提供由局部变量if
引用的对象的类,或者由方法返回的对象的类if
,但从不提供if
本身的类。
但if
控制流关键字不是一个对象,无论如何(既不是对象也不是Object
),因为关键字和控制流不是Ruby中的对象。
在Matz和David Flanagan撰写的The Ruby Programming Language一书中,它在第2页说:
每个值都是一个对象
注意,它并不是说每件事 ,只说每一个值 。
另请参阅问题变量是ruby中的对象吗?
因为它们是语言关键字而不是对象。 通常,您可以分配给变量的所有内容都是对象。
从技术上讲是正确的:诸如unless
关键字可能具有编译器/解释器使用的类(取决于实际实现),但作为语言用户,您甚至没有任何远程实际用途,因此它是没有接触过你。
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也不会立即回答。 的? 是它等待声明其余部分的标志。