为什么在Ruby中存在两种访问模块函数的方法?

前端之家收集整理的这篇文章主要介绍了为什么在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!"

猜你在找的Ruby相关文章