首页 > 学院 > 开发设计 > 正文

Ruby和元编程之万物皆为对象

2019-10-26 19:24:09
字体:
来源:转载
供稿:网友

开篇

空即是色,色即是空。
空空色色,色色空空,在Ruby语言中,万物皆为对象。

Ruby是一个面向对象的语言(Object Oriented Language),面向对象的概念比其他语言要贯彻的坚定很多。

Ruby中不存在Java中原始类型数据和对象类型数据之分。大部分Ruby中的的东东都是对象。

所以,想要掌握Ruby和Ruby的元编程,对象就是第一门必修功课。本回就着重研究一下Ruby中的对象.

Ruby中的对象

如果你从其他面向对象的语言转来,一提到得到一个对象你可能会想到建立一个类,然后建立这个类的实例出来产生一个对象。

在Ruby中这完全是可以的,不过这种先建立类才能获得对象的过程,听起来更像是面向类的设计,而不是面向对象的设计。关于类的一些东西放到下回再说。

在Ruby中,不存在原始类型的概念,1, 0.3, true/false 甚至 nil都是对象。比如,你可以在irb中尝试下面的代码:

代码如下:
>> 1.methods
=> ["%", "odd?", "inspect", "prec_i", "<<", "tap", "div", "&", "clone", ">>", "public_methods", "__send__", "instance_variable_defined?", "equal?", "freeze", "to_sym", "*", "ord", "lcm", "+", "extend", "next", "power!", "send", "round", "methods", <…more methods…> "is_a?", "ceil", "[]"]
>> 1.class
=> Fixnum

你可以在irb中尝试一下其他数据类型,看看他们的方法和类等等信息。

不只是各种数据类型,方法在Ruby中也是对象, 比如下列例子:

代码如下:
>> one_plus = 1.method(:+)
=> #<Method: Fixnum#+>
>> one_plus.class
=> Method
>> one_plus.call(2)
=> 3

有意思的是,方法对象也是有方法的:

代码如下:
>> one_plus.arity()
=> 1

对象到底是什么?

到底什么是对象呢?

简单的说,**对象就是 状态 + 行为**

状态 就是表明当前对象所拥有的属性,每个同类的对象可能有不同的状态,这些状态保存在实例变量里面(Instance Variable).

对象的实例变量可以由instance_variable_set/instance_variable_get来设定/读取:
代码如下:
>> 1.instance_variable_set(:@my_var, "world")
=> "world"
>> 1.instance_variable_get(:@my_var)
=> "world"

行为 行为就是作用在对象上的动作,就是我们常说的方法。Ruby方法的调用,类似于smalltalk或者Objectiv-C,采用消息模式。调用方法相当于对这个对象发送了一个消息。所以对方法的调用也可以这样:

在Ruby中,状态,也就是实例变量是保存在对象里的,而行为或方法则是存在于对象的类或者mixin的module里面。

在静态语言中,编译时就会确定所调用的方法是否存在,不存在会产生编译错误。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表