Post

Ruby中::运算符

::运算符

复习一下Ruby::双冒号。::是一个计算符号,和+-*/一样,但是::的优先级是非常高的,应该是最高优先级(是不是最高不确定,没仔细核查过,但是优先级非常高是肯定的)

.运算符

.号很熟悉了,.运算符可以在类或者实例后面通过.来访问方法,例如Dir.each,注意这里只是访问method,而不能访问常量

::访问常量

所以,::就是可以用来访问常量的,举个例子

1
2
3
4
5
6
7
class Book
  NUM = 100
end

puts Book`::`NUM

100

再测试个例子

1
2
3
4
5
6
7
8
9
10
class Book
  def read
    200
  end
end

book  = Book.new
puts book::read.inspect

200

可以看到::一样可以访问method,在访问method的情况下,::和.可以理解为是一样的效果

因为method也是一种对象,也可以被看成是一种常量!扩展一下,那么class其实也是常量,那::应该也可以用来访问class

1
2
3
4
5
6
7
class Book
  class Note
  end
end
puts Book::Note.inspect

Book::Note

没问题,所以::运算符就可以用来在classmodule中引用常量,以及classmodule自身,像上例中是不能用.运算符来进行Book.Note.inspect引用的,因为这会被认为是引用methods而不是常量

::的接收者

如果::没有显示的接收者,如下例

1
2
3
4
5
6
7
8
9
10
11
12
NUM = 100
class Book
  NUM = 200
  def self.read
    ::NUM
  end
end
puts Book::NUM
puts Book::read

200
100

可以看到Book::NUM返回的200,Book::read返回的100,这是因为如果没有显示的接收者,::NUM实际上等价于默认顶层类Object作为接收者,所以这里的顶层是class外面的NUM

小结

::在各种第三方包以及扩展包中大量存在,因为涉及到各种包的相互调用,理解::后可以更好的看源代码了

Ruby相关文章

1. Ruby类基础

2. 类的public private protected

3. Ruby yield

4. Ruby双冒号

This post is licensed under CC BY 4.0 by the author.