在Ruby编程语言中,既有以美元符号开头的全局变量的概念,例如$foo
,也有以大写字母开头的常量的概念,如Foo
。Ruby中这两种名称在作用域上的确切区别是什么?在什么特定情况下,全局变量应该优先于常量,反之亦然?
全局变量是可以从任何地方访问的变量。它们的作用域变成了整个main
对象。这意味着它们可以在这个范围内的任何地方使用,即代码本身的任何地方。例如
module A
module B
class C
$glo = 'this is glo-bal variable'
end
end
end
module D
class E
CON = 'this is con-stant'
def call_glo
puts $glo
end
def call_con
puts CON
end
end
def self.call_con
puts CON
end
E.new.call_glo #=> "this is glo-bal variable"
end
D::E.new.call_glo #=> "this is glo-bal variable"
D::E.new.call_con #=> "this is con-stant"
D.call_con #=> Throws Error Unitialized Constant
虽然常量被限制在其定义的范围内。它们只能在定义的范围中使用。
现在,正如您所说,常数以大写字母开头,因此所有的类名和模块名本身都只是常数。
现在在上面的示例中,您可以看到call_glo
方法被调用了两次。一旦来自module D
的范围,而一个来自main
对象范围,你看到class E
的实例化之间的区别了吗?
在module D
中,它是在没有任何作用域运算符::
的情况下调用的,而在模块之外,我们必须使用作用域运算符,这就是作用域的限制。常数与绑定