【问题标题】:Inheritance of constructors in RubyRuby中构造函数的继承
【发布时间】:2021-09-24 13:23:36
【问题描述】:

假设我创建了一个继承自 Symbol 的新类。 Symbols 是独一无二的,很明显 Symbol 类没有构造函数。但是哪种机制会阻止在子类中创建构造函数?是否有一些标志使所有孩子都独一无二?

class Syb < Symbol
   def initialize
   end
end
p Syb.respond_to? :new
false

【问题讨论】:

  • initialize 不是构造函数。它是一个初始化器。 new 是构造函数,它不见了。这就是阻止您创建 Syb 实例的原因
  • 好的。并且不可能在祖先的后期添加构造函数?这似乎使sense。但是:SymbolObject 的孩子,Object 响应 new。这对我来说意味着Symbol 删除了从Object 继承的构造函数?
  • 其实可以。而且,我不知道它会如何影响Symbol 的现有行为。
  • @Sergio 非常感谢,现在一切都清楚了!

标签: ruby inheritance constructor


【解决方案1】:

首先我也认为扩展 ruby​​ 核心类不是一个好主意,references

特别是在这种情况下

“为了提高效率,很多核心类的方法都是用 C 而不是 Ruby 编码的。而且在某些情况下,比如这个 Array 加法运算符,它们的实现方式是返回值的类是硬编码的。”

如果你看一下 ruby​​ Symbol 类中的 initialize 方法(确实有):

[36] pry(main)> require 'pry-doc'
=> true
[72] pry(main)> cd Symbol
[73] pry(Symbol):1> $ initialize

From: object.c (C Method):
Owner: BasicObject
Visibility: private
Signature: initialize()
Number of lines: 5

static VALUE
rb_obj_dummy0(VALUE _)
{
    return rb_obj_dummy();
}

所以我们可以看到这个方法已经存在并且是用c实现的,但是关于覆盖ruby核心类方法有一个限制,解释in this answer

而且我也相信用 pry pry-doc 和 pry-gem 来研究 ruby​​ 真的很重要

【讨论】:

  • 是的,这可能是真的。但这不是问题所在。在我的示例中,Syb 类没有尝试使用其父构造函数。
  • 我认为您正在寻找的真正答案是我现在指出的答案,stackoverflow.com/a/7138888/1900722
【解决方案2】:

正如 Sergio 所说,我的错误是混淆了构造函数和初始化程序。实际上可以为 Symbol 类编写一个新的构造函数。

irb(main):001:1* class Symbol
irb(main):002:2*   def Symbol.new x
irb(main):003:2*     x.to_sym
irb(main):004:1*   end
irb(main):005:0> end
=> :new
irb(main):008:0> a = Symbol.new "xyz"
=> :xyz
irb(main):009:0> a
=> :xyz

是的,我意识到这里的符号实际上是由.to_sym 方法创建的。所以new 并不是真正的构造函数,而更像是真正构造函数的包装器。

【讨论】:

    【解决方案3】:

    假设我创建了一个继承自 Symbol 的新类。 Symbols 是独一无二的,很明显 Symbol 类没有构造函数。

    这句话是非常正确的,因为 Ruby 没有构造函数。

    但是哪种机制会阻止在子类中创建构造函数?

    Ruby 没有构造函数这一事实阻止了构造函数的创建。

    是否有一些标志使所有孩子都独一无二?

    没有。

    【讨论】:

      猜你喜欢
      • 2015-11-08
      • 1970-01-01
      • 2013-06-01
      • 2023-04-03
      • 2015-06-21
      • 2018-10-30
      相关资源
      最近更新 更多