7
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
为什么.
和::
都存在?为什么不只是.
?为什么Ruby中存在两种访问模块函数的方法?
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
为什么.
和::
都存在?为什么不只是.
?为什么Ruby中存在两种访问模块函数的方法?
范围解析运算符(::
)可以解析常量,实例方法和类方法,因此只要我们在正确的位置查找,我们就可以基本上使用该运算符。由于方法“func”被定义为模块A的类方法(由类似于“静态”方法的self.func
),它直接属于模块(它本身就是一个对象),所以它可以是用模块作为接收器的点运算符调用。需要注意的是模块A的情况下,没有任何知名度,以“功能”,因为它是一个类的方法:如果该方法被定义为实例方法,那么它只能用点操作上调用
aye = Object.new.extend(A)
aye::funC# raises NoMethodError
aye.func # raises NoMethodError
模块的实例。
module B
def func2
puts "OK!"
end
end
B::func2 # raises NoMethodError
B.func2 # raises NoMethodError
bee = Object.new.extend(B)
bee::func2 # "OK!"
bee.func2 # "OK!"
@RHSeeger,因为Ruby是一种后现代语言:不一定只有一种方法可以完成某件事情(甚至可以认为它有多个)。最低限度的语言核心,就像在C,Java和C中一样,在Ruby中并不真正起作用。 –
@Wayne:删除了我的评论,因为我误解并歪曲了实际问题的内容。当真正的问题是“为什么都有,因为它们是同一件事”时,我把它看作“有什么区别”。虽然我不确定maerics的答案能够清楚地回答这个问题,但我的评论并不合适。 – RHSeeger
作为一个随机的珍闻,我坚定地认为“后现代”是一种标记编程语言的不好方法。我将Ruby称为现代编程语言,这意味着它利用了编程语言设计中的许多发展来创建易于使用和表达(易于维护)的东西。这就是说,Ruby没有任何真正的革命性。我喜欢这门语言,并认为它是来自其他语言的功能的完美结合,但我想不出任何它带来的东西,这是以前的语言的飞跃。 – RHSeeger