声明:本文转载自
http://ruanwz.github.com/2010/02/25/eigenclass.html
Ruby中对象的实例变量(instance_variable)是放在对象中,而对象的方法(instance_methods)则是放在对象的类里。我们可以在irb里用下面的命令来验证:
» “abc”.methods == String.instance_methods
=> true
在ruby里所有都是对象,因此String应该也是对象,下面的命令也应该返回true:
» String.methods == String.class.instance_methods
=> false
出乎意料,原因是String的class并不是String.class。class方法并不总是返回对象的真正的类。在Ruby中,对象真正的类是单例类,也可以叫eigenclass,如果这个对象没有eigenclass,它的类才是class方法返回的值。可以用下面的方式获得对象的eigenclass:
» eigenclass = class « String
» self
» end
=> #Class:String
这时我们再比较两个对象的方法,看看是否一致:
» String.methods == eigenclass.instance_methods
=> true
什么时候对象有eigenclass? 有2种情况,Ruby为你自动生成和自己显式生成。
在声明一个class时,Ruby就会自动为你生成这个class的eigenclass,其他的对象(比如说module)则需要显式生成。通过下面的例子可以看出。
» module A
» end
» class B
» end
» A.object_id
=> -610322468
» B.object_id
=> -610341868
» aeigenclass = class « A
» self
» end
=> #Class:A
» aeigenclass.object_id
=> -610367458
» beigenclass = class « B
» self
» end
=> #Class:B
» beigenclass.object_id
=> -610341878
» class B
» include A
» end
=> B
» aBeigenclass.object_id
=> -610341878 <== 在class中include module不会生成新的eigenclass
在这里通过比较object_id的大小可以看出对象创建的顺序。B是class,它的object_id后面就是B的eigenclass的object_id。而A是module,它的eigenclass在显式赋值时才被创建。
分享到:
相关推荐
从那时起,Ruby 引入了几个新方法,它们提供与这个 gem 的eigenclass和edefine_method方法相同的功能。 安装 gem install eigenclass 要求 Ruby 1.8.7+ 用法 Ruby 中的一切都是对象,包括类。 SomeObject = ...
基于机器学习算法的特征值分类(MATLABR2019b):特征值分类 (EigenClass)。 在这项研究中,提出了一种精确高效的基于特征值的机器学习算法,特别是特征值分类(EigenClass)算法,用于处理分类问题。 使用具有不同...
Ruby中的每个类都拥有一个对应的元类(也称为eigenclass或singleton class),这是实现元编程的关键结构,因为元类允许我们在运行时给类动态地添加方法和属性。 Ruby的元编程能力在Rails框架中得到了广泛的应用。...
4. 特殊方法(Eigenclasses):在Ruby中,每个类都有一个与其相关的单独类,被称为 eigenclass 或 singleton class,也常被称为 metaclass。通过理解 eigenclass 的工作原理,程序员可以实现更高级的元编程技巧,...
3. **Eigenclasses与类层次结构**:每个对象都有一个独特的类,称为“eigenclass”,它可以用来为单个对象定制行为,而不会影响其他同类对象。 4. **闭包与块**:Ruby支持闭包(closures),即可以访问其定义作用域...
"精确稳定的机器学习算法:特征值分类.zip"这个压缩包显然包含了与这一主题相关的资源,让我们逐一解析其中的文件以深入理解这一概念。 首先,我们看到三个MATLAB文件:EigenClass.m、confusionmatResults.m和main....
7.7单键方法和EIGENCLASS257 7.8方法查找258 7.9常量查找261 第8章反射和元编程265 8.1类型、类和模块266 8.2对字符串和块进行求值268 8.3变量和常量271 8.4方法272 8.5钩子方法277 8.6跟踪279 ...