带有前面冒号的Ruby实例变量是什么意思(:@name)?

Mar*_*ark 1 ruby symbols instance-variables

我正在研究Ruby Koans,并提出了问题#193:

  class Dog2
    def set_name(a_name)
      @name = a_name
    end
  end

  def test_instance_variables_can_be_set_by_assigning_to_them
    fido = Dog2.new
    assert_equal [], fido.instance_variables

    fido.set_name("Fido")
    assert_equal [___], fido.instance_variables
  end
Run Code Online (Sandbox Code Playgroud)

答案是"assert_equal : @name,fido.instance_variables".我知道冒号(:)表示符号,atsign(@)表示实例变量.但是,我还没有找到关于结合冒号和atsign意味着什么的文档.

它是什么意思,它是如何使用的?谢谢!

Aje*_*i32 6

它只是一个常规符号:

:@name
#=> :@name
:@name.class
#=> Symbol
Run Code Online (Sandbox Code Playgroud)

根据以下文件Object#instance_variables:

instance_variables→数组

返回接收器的实例变量名称数组.请注意,仅定义访问器不会创建相应的实例变量.

class Fred
  attr_accessor :a1
  def initialize
    @iv = 3
  end
end
Fred.new.instance_variables   #=> [:@iv]
Run Code Online (Sandbox Code Playgroud)

所以这里Ruby Koans说它fido.instance_variables应该等于包含符号的数组:@name.

assert_equal [:@name], fido.instance_variables
Run Code Online (Sandbox Code Playgroud)