인스턴스 변수: 자체 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
그리고.self.age
에age_difference_with
방법.
쓰기@age
인스턴스 변수에 직접 액세스합니다.@age
.쓰기self.age
개체가 자체적으로 메시지를 전송하도록 지시합니다.age
일반적으로 인스턴스 변수를 반환합니다.@age
하지만 그 방법에 따라 다른 많은 것들을 할 수 있습니다.age
메서드가 지정된 하위 클래스에서 구현됩니다.예를 들어, 항상 실제보다 10살 더 어린 나이를 보고하는 중년 사회인 클래스가 있을 수 있습니다.또는 보다 실질적으로 PersistentPerson 클래스는 영구 저장소에서 해당 데이터를 게으르게 읽고 모든 영구 데이터를 해시에 캐시할 수 있습니다.
차이점은 방법의 사용과 실행을 분리하고 있다는 것입니다.만약 부동산의 구현이 변경된다면 - 생년월일을 유지하고 지금과 생년월일 사이의 시간 차이를 기준으로 나이를 계산한다고 가정하면 - 방법에 따라 코드를 변경할 필요가 없습니다.속성을 직접 사용한 경우 변경 내용이 코드의 다른 영역으로 전파되어야 합니다.이런 의미에서, 속성을 직접 사용하는 것은 클래스에서 제공하는 인터페이스를 사용하는 것보다 더 취약합니다.
클래스를 상속할 때 경고 표시Struct.new
이니셜라이저를 생성하는 깔끔한 방법은 무엇입니까(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
첫 번째 대답은 전적으로 옳지만, 상대적으로 초보자로서 그것이 무엇을 의미하는지 즉시 명확하지 않았습니다(스스로에게 메시지를 보내는 것?).어허...)다음과 같은 간단한 예가 도움이 될 것으로 생각합니다.
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
차이가 없습니다.저는 그것이 단지 증거자료의 가치를 보기 위해 행해진 것이라고 의심합니다.self.age
그리고.other_person.age
서로 가까이에
저는 사용이 미래에 실제 게터를 작성할 수 있게 해준다고 생각합니다. 이는 단순히 인스턴스 변수를 반환하는 것보다 더 복잡한 작업을 수행할 수 있으며, 그런 경우에는 방법을 변경할 필요가 없습니다.
하지만 그것은 걱정할 것 같지 않은 추상적인 개념입니다. 만약 객체의 구현이 바뀌면 다른 방법을 변경하는 것이 합리적이고, 어느 시점에서는 객체 자체 내의 단순한 참조가 완벽하게 합리적입니다.
어경우도에, .age
▁of▁use의 명시적인 사용법을 설명하지 못하고 있습니다.self
age
또한 접근자를 호출했을 것입니다.
@age - 인스턴스 변수 연령입니다.
self.age - 인스턴스 속성 기간을 나타냅니다.
언급URL : https://stackoverflow.com/questions/1693243/instance-variable-self-vs
'prosource' 카테고리의 다른 글
Firebase Messaging에서 모든 항목을 한 번에 구독 취소 (0) | 2023.06.07 |
---|---|
Python 3.6.1에서 AttributeError가 발생하는 이유: 모듈 'enum'에는 'IntFlag' 속성이 없습니까? (0) | 2023.06.02 |
WPF - 사용자 컨트롤 내에서 내용 호스팅 (0) | 2023.06.02 |
내 CALayer의 앵커포인트를 변경하면 보기가 이동합니다. (0) | 2023.06.02 |
NumPy를 사용하여 두 배열의 모든 조합 배열 작성 (0) | 2023.06.02 |