我是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
答案 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方法。