Ruby - 数组方法混淆

时间:2009-12-06 11:41:55

标签: ruby language-design

我们可以像这样调用顶层的Array方法

Array(something)

对我来说有意义,它是一个没有显式接收器的方法调用,而self,在这种情况下是主要的,插入在方法调用的前面。但这不等于:

Kernel.Array(something)

这对我没有意义。由于在第一种情况下,对象main是Object类,它将Kernel模块混入,因此具有Array方法。但在第二种情况下,我们在内核模块对象本身上调用Array方法,而不是主对象,它们不是不一样吗?

抱歉我的英语不好。

4 个答案:

答案 0 :(得分:4)

Kernel.Array就是所谓的模块功能。模块函数的其他示例包括Math.sin和Math.hypot等。

模块函数是一种既是模块上的类方法又是私有实例方法的方法。在顶层调用Array()时,您将其作为主对象的私有实例方法调用。当您通过Kernel.Array()调用它时,您将其作为Kernel上的类方法调用。它们是相同的方法。

要了解更多信息,请阅读rubydocs中的module_function方法:http://www.ruby-doc.org/core/classes/Module.html#M001642

答案 1 :(得分:0)

令你困惑的是类和实例方法之间的区别。

类方法没有显式接收器,因此没有self来访问其他字段。他们只是...是。

通常,实例方法用于查询或操纵给定对象的属性,而类方法是“辅助”或“工厂”方法,它们提供某些与某类类相关或特别有用的功能,但不是取决于该类的实际实例(对象)。

不确定Ruby,但是Java(例如)有一个完整的类,Math只包含sin()max()exp()等实例方法。第四:没有“数学”对象,这些只是体现数学算法的方法。这不是最好的例子,因为在Ruby中,这些方法可能作为实例方法直接嵌入到数值类中。

你提到的情况有点混乱,因为Array的{​​{1}}方法和()的{​​{1}}方法实际上是不同的方法的东西。两者都是类方法。

Kernel获取参数列表并生成并返回包含它们的数组。

<{{1>}接受一个“数组能力”类型的单个参数,例如一个序列,并获取该参数返回的值并从中构建一个数组。


<强>更新

downvote也许是合理的;我为在我的专业领域之外接受一个主题而道歉。我想我很快就会删除这个答案。

@ 查克:我真诚地希望语言/图书馆的官方文档能够提供一些有用的线索。这是我在回答这个问题时所咨询的内容。

Array()的rdoc:

  

将arg作为数组返回。首先尝试调用arg.to_ary,然后调用arg.to_a。如果两者都失败,则创建一个包含arg的单个元素数组(除非arg为nil)。

代表Array()

  

返回一个填充了给定对象的新数组。

我不了解你,但我认为如果文档变化那么多,那么他们要么谈论单独的方法,要么文档是火车​​残骸。

@ freeknight:

  

但ruby中的所有内容都是某种对象,甚至是类和模块。而Kernel.Array实际上是对特定对象的方法调用 - 内核对象。

是的,在封面上它也与Java类似。但是Kernel.Array()方法没有对Kernel做任何事情,只有Kernel.Array()正在对Array.()类对象做任何事情,所以这实际上只是一个语义狡辩。这是一个实例方法,因为如果你足够疯狂,可以将它挂在类Array()之外,它仍然会以相同的方式工作。

答案 2 :(得分:0)

class Object mixed-in module Kernel,但Kernel是Object的一个实例。所以内核“模块”方法 - 是它的实例方法。

答案 3 :(得分:-2)

他们是一回事:

  
    

a = Kernel.Array('aa')
        =&GT; [“aa”]
    a.class
        =&GT;阵列
    a =数组('aaa')
        =&GT; [“aaa”]
    a.class
        =&GT;数组

  

也许有别名?