这个双冒号::是什么?例如Foo:酒吧。

我找到了一个定义:

::是一个一元操作符,允许在类或模块内定义的:常量、实例方法和类方法从类或模块外的任何地方访问。

如果你只能使用::来暴露任何东西,那么作用域(私有的,受保护的)有什么用呢?


当前回答

这一切都是为了防止定义与链接到项目中的其他代码冲突。这意味着你可以把事情分开。

例如,你可以在你的代码中有一个名为“run”的方法,你仍然可以调用你的方法,而不是在你链接的其他库中定义的“run”方法。

其他回答

如果你只能使用::来暴露任何东西,那么作用域(私有的,受保护的)有什么用呢?

在Ruby中,所有内容都是公开的,并且可以从其他任何地方修改所有内容。

如果您担心可以从“类定义”之外更改类,那么Ruby可能不适合您。

另一方面,如果您对Java的类被锁定感到沮丧,那么Ruby可能是您正在寻找的对象。

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

class User < ActiveRecord::Base

  VIDEOS_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

这一切都是为了防止定义与链接到项目中的其他代码冲突。这意味着你可以把事情分开。

例如,你可以在你的代码中有一个名为“run”的方法,你仍然可以调用你的方法,而不是在你链接的其他库中定义的“run”方法。

稍微恢复一下这个线程。 我们可以为这个操作符创建一个ruby名称吗:: 令人惊讶的是,我们还没有,因为我们有飞溅,蔓延,散列火箭等。

当然我们可以想出比“双冒号”或“一元运算符”更有趣的东西

思考

四点 四眼 利乐点 啃(半字节- 4位)

不,它不是访问每个方法,它是一个“解析”操作符,也就是说,你用它来解析一个常量/静态符号的范围(或者你可以说的位置)。

例如,在第一行中,Rails使用它来查找ActiveRecord内部的基类。模块,在你的第二个模块中,它用于定位路由类的类方法(静态),等等。

它不是用来暴露任何东西,而是用来“定位”你瞄准镜周围的东西。

http://en.wikipedia.org/wiki/Scope_resolution_operator