代码之家  ›  专栏  ›  技术社区  ›  bryantsai

红宝石常数是什么意思?

  •  4
  • bryantsai  · 技术社区  · 15 年前

    Ruby常量的真正含义是什么?下面的代码没有显示任何“常量”属性。警告已经存在,但我仍然需要改变A所指的内容。

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

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

    6 回复  |  直到 12 年前
        1
  •  14
  •   Pablo Fernandez    15 年前

    这是正确的, 常数 变量 在ruby中,但如果更改它们,则会收到警告。

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

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

    你可以到达 PI Constants::PI Constants::other 这是行不通的。

        2
  •  8
  •   Splat    15 年前

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

        3
  •  4
  •   John Feminella    14 年前

    也就是说,如果你真的想确保人们不让他们肮脏的手接触你的推荐人,你可以使用 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"
    
        4
  •  2
  •   horseyguy    15 年前

    “常量”实际上是一个误称,Ruby“常量”最重要的方面不是它们的不变性,而是它们的查找规则。

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

        5
  •  0
  •   BrunoF    9 年前

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

    类中定义的常量可以被该类的所有方法访问。在类外部创建的对象可以全局访问(在任何方法或类中)。

    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的内置方法将常量设置为private(只能在创建它们的类中访问)。语法如下:

    class Car
      WHEELS = 4
    
      private_constant:WHEELS
    end
    
    Car::WHEELS    # Output: NameError: private constant Car::WHEELS referenced
    
        6
  •  0
  •   Jonathan Hall    7 年前

    TEAM = "Angels"
    

    我知道你知道的这么多,请容忍我。通常,其他编程语言不允许您更改TEAM的值。但是,Ruby不会阻止您,它会获取分配给常量的最后一个值。在上面的示例中,我可以将其值更改为:

    TEAM = "Athletics"
    

    其他编程语言要么抛出错误,要么打印 天使 体育 团队