prosource

인스턴스 변수: 자체 vs @

probook 2023. 6. 2. 20:38
반응형

인스턴스 변수: 자체 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.ageage_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의 명시적인 사용법을 설명하지 못하고 있습니다.selfage또한 접근자를 호출했을 것입니다.

@age - 인스턴스 변수 연령입니다.

self.age - 인스턴스 속성 기간을 나타냅니다.

언급URL : https://stackoverflow.com/questions/1693243/instance-variable-self-vs

반응형