`pub(self)`的可见性与没有`pub`属性有什么不同?

pal*_*asb 11 visibility rust

看到函数的可见性可以声明pub(self)在模块中.这与没有pub属性的私有函数有什么不同?如果它们没有不同,为什么存在这种语法?

Luk*_*odt 11

RFC 1422pub(restricted)中引入了该语法.它引入了两种指定可见性的新方法:

  • pub(crate):使项目对整个当前包装箱可见,但不会超出.
  • pub(in path::to::module):使项目对路径指定的模块树可见.

pub(self)是语法糖pub(in self),它属于第二类:self只是一个路径像super,::foo,bar::baz等等.这意味着,是的,pub(self)使项目对当前模块树可见.

因此,pub(self)相当于省略了pub(self)声明.这甚至在RFC中说明:

如上所述,定义意味着pub(self) item就像一个人刚写的一样item.

RFC还提到了为什么支持它:

主要的理由支持这个级别一般性的(这是否则只是"多余的语法")是宏:一个可以编写扩展到宏观pub($arg)的项目,和宏客户端可以通过self作为$arg获得非酒馆的影响定义.