'to_a'不是'Range'中的方法,但是,它对'Range'有效吗?

时间:2018-10-10 02:09:07

标签: ruby

以下代码有效:

(1..5).to_a

(1..5)Range。方法to_a似乎将范围转换为数组。

但是,Range的文档没有文档。由于该文档可能是使用Yard从源代码自动生成的,因此我怀疑它可能不在方法列表中。自动转换正在进行吗?

上述合法的Ruby如何?

1 个答案:

答案 0 :(得分:1)

  

以下代码是有效的ruby:

b = (1..5).to_a
     

(1..5)Range对象,而bArray对象。类Range的官方(?)文档未记录方法to_a,该方法似乎将范围转换为数组。

     

那么,上述合法的Ruby如何?

Ruby有一种叫做“继承”的东西。继承是一种用于差分代码重用的方法,它实际上不仅在Ruby中存在,而且实际上在许多语言中都非常流行,例如Java,C♯,C ++,Python,PHP,Scala,Kotlin,Ceylon等,以及等等。

继承允许您在一个位置定义方法,然后在另一个位置继承,重写并定义 only 行为不同的方法 。因此,“重复使用差异代码”。

在这种情况下,您正在查看的方法是Enumerable#to_a

注意:Ruby实际上有两种继承形式: mixin继承类继承。 Mixin继承就像类继承一样,其中mixin不知道其超类。 (有关mixin继承的权威资源是Gilad Bracha的博士学位论文The Programming Language Jigsaw – Mixins, Modularity, and Multiple Inheritance。)

  

官方(?)文档

实际上,ruby-doc是第三方站点。没有官方文档站点。 (但是,ruby-doc的文档是从YARV(主要的Ruby实现之一,也是Yukihiro Matsumoto积极贡献的一种)中的文档注释生成的。)

  

由于该文档可能是使用Yard从源头自动生成的,

它实际上是使用RDoc(而不是YARD)从YARV源自动生成的。

  

我很困惑它不能出现在方法列表中,

请注意,我给出的解释是正确的,但可能还有许多其他解释。最简单的一种:该方法不在文档中的原因是未记录该方法。另一个原因可能是文档生成器中的错误导致无法显示该方法的文档,源代码中的错字使文档生成器无法识别文档,还有很多其他原因。

  

那么自动转换正在进行吗?

不。 Ruby没有该语言的自动转换。有一些方法,出于效率考虑,这些方法以非面向对象的方式实现,并且要求对象是 specific 类的实例(与面向对象的方式,只需要对象符合特定协议即可)。因为要求对象成为特定类的实例是一个严格的限制,所以这些方法通常会通过发送特定消息并允许对象以所需对象的形式响应,从而向程序员提供“逃生阴影”课。

例如,所有向控制台打印内容的方法都需要一个String的实例,但是在拒绝该参数之前,它们将首先尝试发送to_s

这些有时有时称为“隐式转换”,但它们与Scala中的隐式转换或C♯中的隐式转换无关。实际上,它们甚至不是语言的一部分,它们只是图书馆作者的约定。