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"
대박. 이제 @name
reader와 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"
같은 방식으로 작동합니다! @name
person 객체 의 인스턴스 변수 는 수동으로 수행했을 때와 같이 설정되므로 다른 방법으로 사용할 수 있습니다.
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_accessor
곳 self
이 시점에서 “열기”클래스 개체입니다.
attr_accessor
친구 의 필요성은 다음 과 같습니다.
-
스몰 토크처럼 루비 는 해당 객체에 대한 메소드 1 외부에서 인스턴스 변수에 액세스 할 수 없습니다 . 즉, 인스턴스 변수는
x.y
Java 또는 Python과 같이 일반적인 형태로 액세스 할 수 없습니다 . 루비y
에서는 항상 보낼 메시지 (또는 “메소드 호출 방법”)로 사용됩니다. 따라서attr_*
메소드는@variable
동적으로 작성된 메소드를 통해 인스턴스 액세스를 프록시하는 랩퍼를 작성합니다. -
보일러 플레이트 짜증
이것이 약간의 세부 사항을 명확히하기를 바랍니다. 행복한 코딩.
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! 질문이 있으시면 언제든지 문의하십시오. 명확히 할 수 있기를 바랍니다.