为什么在Ruby中存在两种访问模块函数的方法?
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
为什么这两个.
和::
存在? 为什么不只是.
?
范围解析运算符( ::
可以解析常量,实例方法和类方法,因此,只要我们在正确的位置查找,我们就可以基本上使用该运算符。
此外,由于方法“func”被定义为模块A的类方法(通过self.func
,类似于“静态”方法),它直接属于模块(它本身就是一个对象),因此可以用模块作为接收器的点运算符。 请注意,模块A的实例对“func”没有任何可见性,因为它是一个类方法:
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!"
链接地址: http://www.djcxy.com/p/7795.html
上一篇: Why do both ways of accesing module functions exist in Ruby?