Ruby的双冒号`::`是什么?

丶灬走出姿态 提交于 2020-02-27 06:31:05

这是什么双冒号:: ? 例如Foo::Bar

我找到一个定义

::是一元运算符,它允许在类或模块之外定义的任何位置访问常量,实例方法和类方法。

如果仅使用::公开任何内容,范围(私有,受保护)有什么用?


#1楼

Ruby on rails使用::进行名称空间解析。

class User < ActiveRecord::Base

  VIDES_COUNT = 10
  Languages = { "English" => "en", "Spanish" => "es", "Mandarin Chinese" => "cn"}

end

要使用它:

User::VIDEOS_COUNT
User::Languages
User::Languages.values_at("Spanish") => "en"

另外,其他用法是:使用嵌套路由时

OmniauthCallbacksController在用户下定义。

路线就像:

devise_for :users, controllers: {omniauth_callbacks: "users/omniauth_callbacks"}


class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

end

#2楼

module Amimal
      module Herbivorous
            EATER="plants" 
      end
end

Amimal::Herbivorous::EATER => "plants"

::用于创建范围。 为了从2个模块访问Constant EATER,我们需要调整模块的范围以达到常量


#3楼

这是关于防止定义与项目中链接的其他代码冲突的全部内容。 这意味着您可以将事情分开。

例如,您的代码中可以有一个称为“运行”的方法,您仍然可以调用该方法,而不是已链接到其他库中定义的“运行”方法。


#4楼

::是一个名称空间解析运算符。 它允许您访问模块中的项目或类中的类级别的项目。 例如,假设您有以下设置:

module SomeModule
    module InnerModule
        class MyClass
            CONSTANT = 4
        end
    end
end

您可以访问CONSTANT从模块外SomeModule::InnerModule::MyClass::CONSTANT

它不会影响在类上定义的实例方法,因为您可以使用不同的语法(点. )来访问它们。

相关注意事项:如果要返回顶级命名空间,请执行以下操作::: SomeModule – Benjamin Oakes


#5楼

::您可以访问在另一个类或模块内定义的常量,模块或类。 它用于提供名称空间,以使方法和类名不会与不同作者的其他类冲突。

当您在Rails中看到ActiveRecord::Base时,表示Rails具有类似

module ActiveRecord
  class Base
  end
end

也就是说,在模块ActiveRecord称为Base的类,该类随后被称为ActiveRecord::Base (您可以在activerecord-nnn / lib / active_record / base.rb的Rails源代码中找到它)

::的常见用法是访问模块中定义的常量,例如

module Math
  PI = 3.141 # ...
end

puts Math::PI

::运算符不允许您绕过标记为私有或受保护的方法的可见性。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!