双冒号(::)允许从类或模块之外的任何位置访问在类或模块内定义的常量,实例方法和类方法。
看这个例子:
class Sample
VAR_SAMPLE="what is the difference?"
def self.show_var
return VAR_SAMPLE
end
def method2
return VAR_SAMPLE
end
end
puts Sample::show_var # => what is the difference?
puts Sample.show_var # => what is the difference?
puts Sample::new::method2 # => what is the difference?
puts Sample.new.method2 # => what is the difference?
然后使用dot(。)和双冒号(::)运算符访问类方法有什么区别?任何想法表示赞赏。
双冒号::
命名空间运算符也可以用作消息发送运算符。换一种说法,
foo.bar
也可以写成
foo::bar
除非没有。
特别.
是总是发送消息。::
是通常一个名称空间查询,除非它不可能是。例如,这意味着您不能调用以大写字母开头的消息,除非您还传递了一个参数列表。
foo = Class.new do
def BAR; :method end
BAR = :constant
end
foo.BAR #=> :method
foo::BAR #=> :constant
foo::BAR() #=> :method
::
也可以用于消息发送的事实是历史的好奇心,除“类工厂”(即返回类的方法)外,在大多数样式指南中均被禁止。想象一下这样设置的Web框架:
module Controller
def self.R(path)
Class.new(AbstractController) do
# a bunch of methods for dealing with routing to `path`
end
end
end
class IndexController < Controller::R '/index.html'
def get
render 'Welcome'
end
end
在这种情况下,在某些样式指南中,编写Controller::R
是可以接受的,因为即使R
是一种方法,它也会返回一个类,因此它的行为类似于一个类。
但这是某些DSL的特殊情况,并且仅在某些样式指南中允许。大多数样式指南都不允许::
发送消息,因为它与互为多余.
,因为它已经具有另一种含义(命名空间解析),并且.
在所有情况下的行为都不尽相同。
然后使用dot(。)和双冒号(::)运算符访问类方法有什么区别?
一方面,您可以说没有什么区别,因为当用作消息发送运算符时,它们都做完全相同的事情。
另一方面,语法上有区别,即不是消息发送,而是完全不同的名称空间查找。从,这是一条消息发送。foo::BAR
foo.BAR
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句