实例变量:自VS @

下面是一些代码:实例变量" title="实例变量">实例变量:自VS @

class Person 

def initialize(age)

@age = age

end

def age

@age

end

def age_difference_with(other_person)

(self.age - other_person.age).abs

end

protected :age

end

我想知道的是在age_difference_with方法使用@ageself.age之间的差异。

回答:

写入@age直接访问实例变量@age。写入self.age告诉对象自己发送消息age,它通常会返回实例变量@age - 但可以执行任意数量的其他操作,具体取决于在给定子类中如何实现age方法。例如,你可能有一个MiddleAgedSocialite类,它总是报告比其实际年龄小10岁的年龄。或者更实际上,PersistentPerson类可能懒惰地从持久性存储中读取数据,将其所有持久数据缓存在散列中。

回答:

不同之处在于,它将该方法的使用与实施隔离开来。如果财产的实施发生变化 - 比如说保留出生日期,然后根据现在和出生日期之间的时间差计算年龄 - 那么取决于方法的代码不需要改变。如果它直接使用该属性,则该更改将需要传播到代码的其他区域。从这个意义上讲,直接使用属性比使用类提供的接口更脆弱。

回答:

没有任何区别。我怀疑这只是为了看到self.ageother_person.age彼此靠近的文件值。

我想这种使用确实允许将来写入一个实际的getter,这可能会做一些比只返回一个实例变量更复杂的东西,在这种情况下,该方法不需要改变。

但是,这是一个不太可能的抽象担心,毕竟,如果对象的实现改变了它是合理的改变其他方法,在某些时候对象本身的简单引用是完全合理的。

在任何情况下,age属性的抽象仍然没有解释明确使用的self,因为只是简单的age也援引了访问。

回答:

是当你继承Struct.new一类是产生一个初始化器(How to generate initializer in Ruby?)

一个整洁的方式警告

class Node < Struct.new(:value) 

def initialize(value)

@value = value

end

def show()

p @value

p self.value # or `p value`

end

end

n = Node.new(30)

n.show()

将返回

30 

nil

然而,当您删除初始化,它将返回

nil 

30

随着类定义

class Node2 

attr_accessor :value

def initialize(value)

@value = value

end

def show()

p @value

p self.value

end

end

您应该提供构造函数。

n2 = Node2.new(30) 

n2.show()

将返回

30 

30

回答:

@age - 绝对是实例变量年龄

self.age - 指的是实例属性的年龄。

回答:

第一个答案是完全正确的,但作为一个相对的新手,它并没有立即清楚它的含义(发送消息给自己,呃呃......)。我认为一个简短的例子将有所帮助:

class CrazyAccessors 

def bar=(val)

@bar = val - 20 # sets @bar to (input - 20)

end

def bar

@bar

end

def baz=(value)

self.bar = value # goes through `bar=` method, so @bar = (50 - 20)

end

def quux=(value)

@bar = value # sets @bar directly to 50

end

end

obj = CrazyAccessors.new

obj.baz = 50

obj.bar # => 30

obj.quux = 50

obj.bar # => 50

以上是 实例变量:自VS @ 的全部内容, 来源链接: utcz.com/qa/260269.html

回到顶部