标识符

Ruby的标识符用于命名局部变量、实例变量、类变量、全局变量、常量、方法以及块。标识符的命名有一套固有规则。

命名规则

  • 必须以字母、数字或下划线为开头,长度只受硬件内存大小限制
  • Ruby的保留字不得用作标识符的命名。

Ruby中标识符的分类

  • 变量

    • 本地变量, 也叫局部变量,比如 「name」。
    • 实例变量,以@为开头的变量,为实例对象所用,比如「@name」。
      • 类实例变量, 也是以@为开头的变量,为类所用,比如「@name」。
    • 类变量, 以@@为开头的变量,也是为类所用,比如「@@name」。
    • 全局变量,全局范围内都可以被使用的变量,类似于类变量,但是写法不同,比如「$name」
    • 常量, 以大写字母为开头,比如「Klass,Node」。Ruby中常量的值是可以被修改的,只是出一个警告。
  • 方法与块

    方法和块的命名规则,和本地变量一样,如果是两个单词以上,用下划线分割。比如「get_name」

Chef中变量的命名

贴一段Chef的源码,大家来感受一下:

class Chef
  class Node

    extend Forwardable

    def_delegators :attributes, :keys, :each_key, :each_value, :key?, :has_key?

    attr_accessor :recipe_list, :run_state, :override_runlist

    # RunContext will set itself as run_context via this setter when
    # initialized. This is needed so DSL::IncludeAttribute (in particular,
    # #include_recipe) can access the run_context to determine if an attributes
    # file has been seen yet.
    #--
    # TODO: This is a pretty ugly way to solve that problem.
    attr_accessor :run_context

    include Chef::Mixin::FromFile
    include Chef::DSL::IncludeAttribute
    include Chef::DSL::PlatformIntrospection

    include Chef::Mixin::ParamsValidate

    # Create a new Chef::Node object.
    def initialize
      @name = nil

      @chef_environment = '_default'
      @primary_runlist = Chef::RunList.new
      @override_runlist = Chef::RunList.new

      @attributes = Chef::Node::Attribute.new({}, {}, {}, {})

      @run_state = {}
    end

  # ...


end