[ruby] Ruby에서 attr_accessor 란 무엇입니까?

Rubyattr_accessor 에서 이해하는 데 어려움을 겪고 있습니다.
누군가 나에게 이것을 설명 할 수 있습니까?



답변

수업이 있다고 가정 해 봅시다 Person.

class Person
end

person = Person.new
person.name # => no method error

분명히 우리는 method를 정의하지 않았다 name. 그걸하자.

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error

아하, 우리는 이름을 읽을 수 있지만 그렇다고해서 이름을 지정할 수있는 것은 아닙니다. 그것들은 두 가지 다른 방법입니다. 전자는 리더 라고 하고 후자는 라이터 라고 합니다. 우리는 아직 작가를 만들지 않았으므로 그렇게하겠습니다.

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

대박. 이제 @namereader와 writer 메소드를 사용하여 인스턴스 변수 를 쓰고 읽을 수 있습니다 . 예외적으로, 이렇게 자주 수행되는데 왜 매번 이러한 방법을 쓰는 데 시간이 낭비됩니까? 우리는 더 쉽게 할 수 있습니다.

class Person
  attr_reader :name
  attr_writer :name
end

이것조차도 반복 될 수 있습니다. 독자와 작가 모두를 원할 때 접근자를 사용하십시오!

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

같은 방식으로 작동합니다! @nameperson 객체 의 인스턴스 변수 는 수동으로 수행했을 때와 같이 설정되므로 다른 방법으로 사용할 수 있습니다.

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

그게 다야. 방법을 이해하기 위해 attr_reader, attr_writer그리고 attr_accessor다른 답변, 책, 루비 문서를, 방법은 실제로 당신을위한 방법을 생성 읽습니다.


답변

attr_accessor단지 메소드 입니다. (링크는 작동 방식에 대한 더 많은 통찰력을 제공해야합니다. 생성 된 메소드 쌍을 살펴보고 튜토리얼에서이를 사용하는 방법을 보여 주어야합니다.)

트릭은 Ruby 의 정의class아니며 (C ++ 및 Java와 같은 언어에서는 “그냥 정의”임), 평가 하는 표현식입니다 . 때이 평가 중입니다 attr_accessor방법은 차례 수정에 현재 클래스가있는 호출 – 암시 수신기를 기억 self.attr_accessorself이 시점에서 “열기”클래스 개체입니다.

attr_accessor친구 의 필요성은 다음 과 같습니다.

  1. 스몰 토크처럼 루비 는 해당 객체에 대한 메소드 1 외부에서 인스턴스 변수에 액세스 할 수 없습니다 . 즉, 인스턴스 변수는 x.yJava 또는 Python과 같이 일반적인 형태로 액세스 할 수 없습니다 . 루비 y에서는 항상 보낼 메시지 (또는 “메소드 호출 방법”)로 사용됩니다. 따라서 attr_*메소드는 @variable동적으로 작성된 메소드를 통해 인스턴스 액세스를 프록시하는 랩퍼를 작성합니다.

  2. 보일러 플레이트 짜증

이것이 약간의 세부 사항을 명확히하기를 바랍니다. 행복한 코딩.


1 이것은 사실이 아니며 이에 대한 “기술”이 있지만 “공개 인스턴스 변수”액세스에 대한 구문 지원은 없습니다.


답변

attr_accessor@pst가 말한 것처럼 그냥 메소드입니다. 그것이하는 일은 더 많은 방법을 만드는 것입니다.

따라서이 코드는 다음과 같습니다.

class Foo
  attr_accessor :bar
end

이 코드와 동일합니다 :

class Foo
  def bar
    @bar
  end
  def bar=( new_value )
    @bar = new_value
  end
end

Ruby에서 이런 종류의 메소드를 직접 작성할 수 있습니다.

class Module
  def var( method_name )
    inst_variable_name = "@#{method_name}".to_sym
    define_method method_name do
      instance_variable_get inst_variable_name
    end
    define_method "#{method_name}=" do |new_value|
      instance_variable_set inst_variable_name, new_value
    end
  end
end

class Foo
  var :bar
end

f = Foo.new
p f.bar     #=> nil
f.bar = 42
p f.bar     #=> 42


답변

attr_accessor 매우 간단합니다 :

attr_accessor :foo

다음에 대한 바로 가기입니다.

def foo=(val)
  @foo = val
end

def foo
  @foo
end

객체에 대한 getter / setter에 지나지 않습니다.


답변

기본적으로 루비에는없는 공개적으로 액세스 가능한 데이터 속성을 위조합니다.


답변

인스턴스 변수에 대한 getter 및 setter 메소드를 정의하는 메소드 일뿐입니다. 구현 예는 다음과 같습니다.

def self.attr_accessor(*names)
  names.each do |name|
    define_method(name) {instance_variable_get("@#{name}")} # This is the getter
    define_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setter
  end
end


답변

코드없이 간단한 설명

위의 답변 중 대부분은 코드를 사용합니다. 이 설명은 유추 / 이야기를 통해 아무 것도 사용하지 않고 대답하려고합니다.

외부 당사자는 내부 CIA 비밀에 액세스 할 수 없습니다

  • CIA라는 정말 비밀스러운 장소를 상상해 봅시다. CIA 내부의 사람들을 제외하고 CIA에서 무슨 일이 일어나고 있는지 아무도 모른다. 즉, 외부인은 CIA의 정보에 액세스 할 수 없습니다. 그러나 완전히 비밀을 유지하는 조직을 보유하는 것은 좋지 않기 때문에 특정 정보를 외부 세계에 공개 할 수 있습니다. CIA가 모든 사람이 당연히 알고 싶어하는 것만 : CIA 국장,이 부서의 환경 친화적 비교 기타 정보 : 기타 정보 : 예 : 이라크 또는 아프가니스탄에서 비밀 요원이되는 사람 – 이러한 유형의 물건은 아마도 향후 150 년 동안 비밀로 남아있을 것입니다.

  • CIA 외부에있는 경우 공개적으로 제공 한 정보에만 액세스 할 수 있습니다. 또는 CIA 용어를 사용하려면 “삭제 된”정보에만 액세스 할 수 있습니다.

  • CIA가 CIA 외부의 일반 대중에게 제공하고자하는 정보를 속성 이라고 합니다.

읽기 및 쓰기 속성의 의미 :

  • CIA의 경우 대부분의 속성은 “읽기 전용”입니다. 이는 귀하가 CIA 외부 당사자 인 경우 “CIA 책임자는 누구입니까?”라고 요청할 수 있습니다 . 그리고 당신은 정답을 얻을 것입니다. 그러나 “읽기 전용”속성으로 수행 할 수없는 것은 CIA를 변경하는 것입니다. 예를 들어, 전화를 걸 수 없으며 Kim Kardashian이 감독이되기를 원하거나 Paris Hilton이 최고 사령관이되기를 원한다고 갑자기 결정 합니다.

  • 속성이 “쓰기”액세스 권한을 부여한 경우 외부에 있더라도 원하는 경우 변경할 수 있습니다. 그렇지 않으면, 당신이 할 수있는 유일한 것은 읽기입니다.

    즉, 접근자는 접근자가 읽기 또는 쓰기 접근 자인지에 따라 외부인을 허용하지 않는 조직에 대해 문의하거나 변경을 수행 할 수 있습니다.

클래스 내부의 객체는 서로 쉽게 액세스 할 수 있습니다.

  • 반면에 이미 CIA 내부에 있다면 Kabul에서 CIA 요원을 쉽게 호출 할 수 있습니다.이 정보는 이미 내부에 있으면 쉽게 액세스 할 수 있기 때문입니다. 그러나 CIA 외부에 있는 경우 액세스 권한이 부여되지 않습니다. 자신이 누구인지 알 수 없으며 (읽기 권한) 미션을 변경할 수 없습니다 (쓰기 권한).

클래스와 그 안의 변수, 속성 및 메서드에 액세스 할 수있는 기능과 똑같은 것입니다. HTH! 질문이 있으시면 언제든지 문의하십시오. 명확히 할 수 있기를 바랍니다.