在没有@的情况下调用实例变量

时间:2013-08-29 03:53:32

标签: ruby instance-variables

我是Ruby编程的新手,我已经看到了一些例子,其中一个实例变量被调用,前面没有“@”符号。

我不确定是否这样,因为正在调用该方法,并且实例变量由于类中的attr_reader而存储在方法中,或者因为我对实例变量有错误的理解。

以下是我所指的从Russ Olsen的Eloquent Ruby中获取的一个示例,其中@unique数组在其上面调用了size方法,而前面没有“@”符号:

class TextCompressor
attr_reader :unique, :index

def initialize(text)
    @unique = []
    @index = []
    add_text(text)
end

def add_text(text)
    words = text.split
    words.each { |word| add_word(word) }
end

def add_word(word)
    i = unique_index_of(word) || add_unique_word(word)
    @index << i
end

def unique_index_of(word)
    @unique.index(word)
end

def add_unique_word(word)
    @unique << word
    unique.size - 1
end
end

4 个答案:

答案 0 :(得分:2)

我也是Ruby的新手,已经学习了几个星期。我相信:

attr_reader :unique

在功能上与定义方法相同:

def unique
  @unique
end

答案 1 :(得分:1)

attr_reader使用您提供的参数的名称创建方法,返回具有相同名称的实例变量。例如: -

attr_reader :name

它将在运行时创建一个方法,如此

  def name
    @name
  end

和attr_writer一样,它为该参数创建了一个setter方法,如

attr_writer :name

def name=(value)
  @name = value
end

并且,attr_accessor使用您提供的参数的名称创建getter和setter。

答案 2 :(得分:1)

您不“调用”实例变量,而是调用方法。你的假设是正确的,你在没有“@”的情况下进行实际的方法调用。 attr_accessor :unique, :index基本上等同于:

def unique
  @unique
end

def unique=(val)
  @unique = val
end

def index
  @index
end

def index=(val)
  @index = val
end

当定义unique = val方法时,你可以编写unique=(val)是Ruby提供的语法糖,使其看起来像变量赋值,即使它实际上是一个方法调用。

通常,您不应混合使用一种方法引用实例变量的不同方法。如果方法必须知道存储值的实现细节,则可以使用@进行直接访问。否则,您应该使用访问器方法。代码越少,依赖于实现细节越好。即使它是相应实例的实例方法内部。

答案 3 :(得分:0)

该行:

attr_reader :unique, :index

为unique和index创建getter方法:

def unique
 @unique
end

所以当你打电话时:

unique.size

它首先调用getter方法,该方法返回@unique,然后返回size方法。