Ruby 中构造函数的继承
Inheritance of constructors in Ruby
假设我创建了一个继承自 Symbol 的新 class。 Symbols 是唯一的,很明显 Symbol class 没有构造函数。但是哪种机制会阻止在 child class 中创建构造函数?是否有一些标志使所有 children 独一无二?
class Syb < Symbol
def initialize
end
end
p Syb.respond_to? :new
false
首先,我也认为扩展 ruby 核心 classes、references
不是一个好主意
在这种情况下尤其如此
“为了提高效率,许多核心 class 方法是用 C 编写的,而不是 Ruby。在某些情况下,例如这个数组加法运算符,它们的实现方式是return 值的 class 是硬编码的。"
如果你看一下ruby符号class中的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核心classes方法的限制,解释in this answer
而且我也相信调查 ruby 非常重要,pry pry-doc 和 pry-gem
正如 Sergio 所说,我的错误是混淆了构造函数和初始值设定项。实际上可以为符号 class.
编写一个新的构造函数
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
并不是真正的构造函数,而更像是真正构造函数的包装器。
Lets say I create a new class which inherits from Symbol. Symbols are unique and it is very clear that the Symbol class has no Constructor.
这个陈述是平凡的,因为 Ruby 没有构造函数。
But which mechanism prevents the creation of a constructor in the child class?
Ruby 没有构造函数这一事实阻止了构造函数的创建。
Is there some flag which makes all children unique?
没有
假设我创建了一个继承自 Symbol 的新 class。 Symbols 是唯一的,很明显 Symbol class 没有构造函数。但是哪种机制会阻止在 child class 中创建构造函数?是否有一些标志使所有 children 独一无二?
class Syb < Symbol
def initialize
end
end
p Syb.respond_to? :new
false
首先,我也认为扩展 ruby 核心 classes、references
不是一个好主意在这种情况下尤其如此
“为了提高效率,许多核心 class 方法是用 C 编写的,而不是 Ruby。在某些情况下,例如这个数组加法运算符,它们的实现方式是return 值的 class 是硬编码的。"
如果你看一下ruby符号class中的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核心classes方法的限制,解释in this answer
而且我也相信调查 ruby 非常重要,pry pry-doc 和 pry-gem
正如 Sergio 所说,我的错误是混淆了构造函数和初始值设定项。实际上可以为符号 class.
编写一个新的构造函数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
并不是真正的构造函数,而更像是真正构造函数的包装器。
Lets say I create a new class which inherits from Symbol. Symbols are unique and it is very clear that the Symbol class has no Constructor.
这个陈述是平凡的,因为 Ruby 没有构造函数。
But which mechanism prevents the creation of a constructor in the child class?
Ruby 没有构造函数这一事实阻止了构造函数的创建。
Is there some flag which makes all children unique?
没有