我们可以像这样调用顶层的Array方法
Array(something)
对我来说有意义,它是一个没有显式接收器的方法调用,而self,在这种情况下是主要的,插入在方法调用的前面。但这不等于:
Kernel.Array(something)
这对我没有意义。由于在第一种情况下,对象main是Object类,它将Kernel模块混入,因此具有Array方法。但在第二种情况下,我们在内核模块对象本身上调用Array方法,而不是主对象,它们不是不一样吗?
抱歉我的英语不好。答案 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;数组
也许有别名?