Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是Ruby';它类似于Python元类?_Python_Ruby_Metaprogramming_Metaclass - Fatal编程技术网

什么是Ruby';它类似于Python元类?

什么是Ruby';它类似于Python元类?,python,ruby,metaprogramming,metaclass,Python,Ruby,Metaprogramming,Metaclass,Python有元类的概念,如果我理解正确的话,它允许您在构建类时修改类的对象。您不是在修改类,而是要创建然后初始化的对象 Python(我相信至少从3.0开始)也有类装饰器的概念。同样,如果我理解正确,类装饰器允许在声明类定义时修改它 现在我相信Ruby中有一个或多个与类decorator等价的特性,但我目前还不知道有什么与元类等价的特性。我相信您可以通过一些函数轻松地抽取任何Ruby对象,并对其执行您想要的操作,但是该语言中是否有一个功能可以像元类那样设置它 那么,Ruby是否有类似于Pyth

Python有元类的概念,如果我理解正确的话,它允许您在构建类时修改类的对象。您不是在修改类,而是要创建然后初始化的对象

Python(我相信至少从3.0开始)也有类装饰器的概念。同样,如果我理解正确,类装饰器允许在声明类定义时修改它

现在我相信Ruby中有一个或多个与类decorator等价的特性,但我目前还不知道有什么与元类等价的特性。我相信您可以通过一些函数轻松地抽取任何Ruby对象,并对其执行您想要的操作,但是该语言中是否有一个功能可以像元类那样设置它

那么,Ruby是否有类似于Python元类的东西呢

编辑我开始使用Python的元类。元类和类装饰器所做的事情看起来非常相似。它们都在定义类时修改类,但方式不同。希望有一位Python大师能进来,更好地解释Python中的这些特性

但是类或类的父类可以实现一个
\uuuuu new\uuuuuu(cls[,…])
函数,该函数在使用
\uuuuu init\uuuuuuuuu(self[,…])
初始化对象之前对对象的构造进行自定义


编辑此问题主要用于讨论和学习两种语言在这些功能方面的比较。我熟悉Python,但不熟悉Ruby,我很好奇。希望任何对这两种语言有相同问题的人都会发现这篇文章很有帮助,也很有启发性

Ruby没有元类。Ruby中有一些构造,有些人有时会错误地称之为元类,但实际上并非如此(这是造成无尽困惑的根源)

然而,有很多方法可以在Ruby中实现与元类相同的结果。但如果不告诉我们你到底想做什么,就无法知道这些机制可能是什么

简言之:

  • Ruby没有元类
  • Ruby没有任何一个与Python元类对应的构造
  • Python使用元类所能做的一切都可以在Ruby中完成
  • 但是没有单一的构造,您将使用不同的构造,具体取决于您想要做什么
  • 这些构造中的任何一个都可能有其他与元类不对应的特性(尽管它们可能与Python中的其他特性相对应)
  • 虽然您可以在Ruby中使用Python中的元类做任何事情,但这并不一定是简单的
  • 虽然通常会有一个更为优雅的解决方案
  • 最后但并非最不重要的一点:虽然您可以在Ruby中使用Python中的元类做任何事情,但这样做不一定是Ruby的方式
那么,元类到底是什么?嗯,他们是一班一班的。那么,让我们后退一步:究竟什么是类?

班级

  • 工厂是生产物品的工厂
  • 定义对象的行为
  • 在形而上学的层面上定义类的实例意味着什么
例如,
Array
类生成数组对象,定义数组的行为并定义“数组属性”的含义

回到元类

元类

  • 工厂是用来上课的吗
  • 定义类的行为
  • 在形而上学的层面上定义阶级的含义
在Ruby中,这三项职责分为三个不同的位置:

  • 类创建类并定义一点行为
  • 单个类的特征类定义了类的一些行为
  • “类”的概念被硬连线到解释器中,解释器也实现了大部分行为(例如,您不能从
    类继承来创建一种新的类,以不同的方式查找方法,或者类似的东西–方法查找算法被硬连线到解释器中)
因此,这三件事一起扮演元类的角色,但它们都不是元类(每一件都只实现了元类所做的一小部分),它们的总和也不是元类(因为它们做的远不止这些)


不幸的是,有些人把类的特征类称为元类。(直到最近,我还是那些被误导的灵魂之一,直到我最终看到了光明。)其他人称所有特征类为元类。(不幸的是,其中一人是最流行的Ruby元编程和Ruby对象模型教程的作者。)一些流行的库向
对象添加了
元类
方法,该方法返回对象的特征类(例如ActiveSupport、Facets、metaid)。有些人将所有虚拟类(即特征类和包含类)称为元类。有些人把
Class
称为元类。即使在Ruby源代码本身中,“元类”一词也被用来指代那些不是元类的东西。

您更新的问题现在看起来完全不同了。如果我没有弄错的话,您希望钩住对象分配和初始化,这与元类完全无关。(但你仍然没有写下你真正想做的事情,所以我可能还是会离开。)

在一些面向对象的语言中,对象是由构造函数创建的。然而,Ruby没有构造函数。构造函数只是工厂方法(有愚蠢的限制);如果您可以使用(更强大的)工厂方法,那么就没有理由使用设计良好的语言

Ruby中的对象构造是这样工作的:对象构造是s
x = X.allocate
x.initialize
class Class
  def new(*args, &block)
    obj = allocate
    obj.initialize(*args, &block)

    return obj
  end
end
class Foo
  def self.new(*args, &block)
    @instances ||= 0
    raise 'Too many instances!' if @instances >= 2

    obj = allocate
    obj.send(:initialize, *args, &block)

    @instances += 1

    return obj
  end

  attr_reader :name

  def initialize(name)
    @name = name
  end
end

one = Foo.new('#1')
two = Foo.new('#2')
puts two.name         # => #2
three = Foo.new('#3') # => RuntimeError: Too many instances!