ruby - 为什么在 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 - 为什么在 Ruby 中存在两种访问模块函数的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6412040/

相关文章:

ruby-on-rails - 如何删除开始转发的消息 : part of an email body in a rails 3 app

ruby-on-rails - 在 Rails 应用程序中本地使用 gem 而不修改 Gemfile

ruby - Sinatra + HTTPS 重定向到 HTTP?

ruby - 为什么 Ruby setter 方法返回的是字符串而不是符号作为最后计算的表达式?

ruby-on-rails - 如何在代理后面使用 bundler ?

ruby - 我如何模拟在 rspec 中创建目录?

ruby-on-rails - Mac OS X 10.7.3 上的 Ruby on Rails 安装新增功能

ruby - 即使在 selenium ruby​​ 脚本完成后如何让浏览器保持打开状态

ruby-on-rails - ruby 只拒绝哈希数组中的某些重复项

ruby - 更改纯 ruby (不是铁轨)的时区