Ruby常量是什么意思?

时间:2009-12-30 00:25:44

标签: ruby constants

Ruby常量的真正含义是什么?以下代码未显示任何“常量”属性。警告就在那里,但我仍然要改变A所指的内容。

A = 1
puts A # => 1
A = 2  # warning: already initialized constant A
puts A # => 2

或者Ruby常量只是一个没有任何执行的指示?

6 个答案:

答案 0 :(得分:14)

没错,常量就像ruby中的变量一样,但是如果你改变它们就会收到警告。

此外,仅仅存在变量的一个区别:您可以访问常量,即使它们是在另一个类或模块中定义的,例如给定此片段:

module Constants
  PI = 3,1415
  other = "variable"
end

您可以PI Constants::PI Constants::other,而{{1}}无效。

答案 1 :(得分:8)

是的,除了打印警告之外,不会强制执行Ruby常量。

答案 2 :(得分:3)

这是对的 - 分配一个常量是一个警告,而不是一个错误; “常量”只是一个指示你应该如何使用某些东西的指标,而不是你那样使用它的规则。

这听起来可能来自静态编程世界,但它在各种元编程设施中非常有用,它可以实现静态语言中完全不可能的事情。

那就是说,如果你真的想确保人们把你的肮脏的手放在你的引用上,你可以使用Object#freeze。改变参考指向的内容仍然可以;你无法改变引用本身的内容:

irb(main):001:0> class Fruit; attr_accessor :name; end
=> nil
irb(main):002:0> f = Fruit.new
=> #<Fruit:0xb7e06570>
irb(main):003:0> f.name = "apple"
=> "apple"
irb(main):004:0> f.freeze                # After freeze, can't touch this Fruit.
=> #<Fruit:0xb7e06570 @name="apple">
irb(main):005:0> f.name = "banana"
TypeError: can't modify frozen object    # Kablammo!
    from (irb):5:in `name='
    from (irb):5

但这没关系:

irb(main):006:0> f = Fruit.new
=> #<Fruit:0xb7dfed84>
irb(main):007:0> f.name = "banana"
=> "banana"

答案 3 :(得分:2)

“常量”实际上是用词不当,Ruby的“常量”最重要的方面不是它们的不变性,而是它们的查找规则。

请参阅:http://coderrr.wordpress.com/2008/03/11/constant-name-resolution-in-ruby/

答案 4 :(得分:0)

常量用于存储不应更改的值。他们的名字必须以大写字母开头。按照惯例,大多数常量名称都以全部大写字母书写,下划线为单词分隔符,例如SOME_CONSTANT。

类中定义的常量可以由该类的所有方法访问。可以在全局范围内(在任何方法或类中)访问在类外创建的那些。

class Car
  WHEELS = 4

  def initialize
    puts WHEELS
  end
end

c = Car.new     # Output: 4

请注意,Ruby不会阻止我们更改常量的值,它只会发出警告。

SOME_CONSTANT = "foo"
SOME_CONSTANT = "bar"
warning: already initialized constant SOME_CONSTANT
warning: previous definition of SOME_CONSTANT was here

在Ruby中,所有类和模块名都是常量,但约定规定它们应该用驼峰式编写,例如SomeClass。

通过使用::(双冒号)运算符,可以从类外部访问常量,甚至可以在另一个类中访问。要从Car类外部访问WHEELS常量,我们将使用Car :: WHEELS。 ::运算符允许从定义它们的类或模块外部访问常量,公共实例方法和类方法。

一个名为private_constant的内置方法使常量变为私有(只能在创建它们的类中访问)。语法如下:

class Car
  WHEELS = 4

  private_constant:WHEELS
end

Car::WHEELS    # Output: NameError: private constant Car::WHEELS referenced

答案 5 :(得分:0)

如果你来自其他编程语言,那么Ruby处理常量的方式与你习惯的不同。通常,常量采用不会在整个应用程序中更改的值。语法是在命名常量时使用所有大写字母,以便应用程序知道如何处理它。例如,要设置一个常数以保持棒球队,您可以这样声明:

TEAM = "Angels"

我知道你知道的很多,在这里忍受我。通常,其他编程语言不允许您更改TEAM的值。但是,Ruby不会阻止您并将最后一个值赋给常量。在上面的例子中,我可以将其值更改为:

TEAM = "Athletics"

其他编程语言会抛出错误或打印 Angels 的值。但是,Ruby打印值 Athletics ,因为这是分配给变量 TEAM 的最后一个值。此外,它还会显示一条警告消息,指出常量已经初始化并且已更改,因为更改常量被认为是一种糟糕的编程习惯。但是,它仍然允许您进行更改并遵循Ruby惯例,即信任开发人员以做出正确的编程决策。因此,在Ruby中使用常量时要小心,因为它们可以被覆盖。