루비에서 attr_accessor
를 이해하는 데 어려움을 겪고 있습니다. 누군가 설명해 주실 수 있나요?
class Person
end
person = Person.new
person.name # => no method error
분명히 우리는 결코 정의된 메서드를 '이름'. # 39 의 let& 그렇잖아요.
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
아하, 우리는 우리가 할 수 있으나, 그 이름을 읽을 수 있는 doesn& # 39, t 짓궂군요 이름을 지정합니다. 이들은 서로 다른 두 가지 방법. 전 호출됨 판독기에서 rmw 호출됨 및 작성기에. 그래서 우리는 아직 # 39, s, t # 39 didn& 만듭다 작성기에 let& 그렇잖아요.
class Person
def name
@name
end
def name=(str)
@name = str
end
end
person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"
멋집니다. 이제 읽기 및 쓰기 '와' 인스턴스 변수를 사용하여 판독기에서 @name 작성기에 방법. 그러나, 이것은 그렇게 자주 쓰는 시간을 낭비하지 때마다 왜 이러한 방법은? We can do it 간편해집니다.
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 때와 마찬가지로 우리는 그것을했다 수동으로 설정할 수 있도록 다른 방법을 쓸 수 있다.
class Person
attr_accessor :name
def greeting
"Hello #{@name}"
end
end
person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"
attr_accessor는 메소드일 뿐입니다. (링크에서 생성된 메서드 쌍을 보면 작동 방식에 대한 자세한 내용을 확인할 수 있으며, 튜토리얼에서 사용 방법을 확인할 수 있습니다.)
비결은 'class'가 Ruby에서는 '정의'가 아니라(C++ 및 Java와 같은 언어에서는 '정의일 뿐'입니다) '평가하는 표현식'이라는 점입니다. 이 평가 중에 현재 클래스를 수정하는 attr_accessor
메서드가 호출되며, 이때 self
는 현재 클래스 객체인 self.attr_accessor
라는 암시적 수신자를 기억하세요.
attr_accessor`와 친구들이 필요한 이유는 바로 이것입니다:
루비는 Smalltalk와 마찬가지로 인스턴스 변수를 해당 객체에 대한 메서드1 외부에서 액세스하는 것을 허용하지 않습니다. 즉, 인스턴스 변수는 자바나 파이썬에서 흔히 볼 수 있는 x.y
형식으로 접근할 수 없습니다. Ruby에서 y
는 항상 전송할 메시지(또는 호출할 메서드)로 간주됩니다. 따라서 attr_*
메서드는 동적으로 생성된 메서드를 통해 인스턴스 @변수
액세스를 프록시하는 래퍼를 생성합니다.
상용구는 짜증난다
몇 가지 세부 사항을 명확하게 설명해 드렸기를 바랍니다. 즐거운 코딩 되세요.
<sup<1</sup< 이것은 엄밀히 말하면 사실이 아니며 [이와 관련된 몇 가지 기술]이 있지만(https://stackoverflow.com/questions/1074729/get-the-value-of-an-instance-variable-given-its-name), [공용 인스턴스 변수] 액세스에 대한 구문 지원은 없습니다.
attr_accessor '는' (as @pst 밝혔다) 그냥 메서드입니다. What it 은 많이 만드는 방법을 사용할 수 있습니다.
그래서 이 코드 위치:
class Foo
attr_accessor :bar
end
이 코드를 것과 같습니다.
class Foo
def bar
@bar
end
def bar=( new_value )
@bar = new_value
end
end
이러한 종류의 에서 루비 교도관님도요 방법을 쓸 수 있습니다.
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
Setter 와 getter 메서드 정의하는 방법은 바로 인스턴스 변수. 예를 들어 구축상의 다음과 같습니다.
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
위의 코드를 사용하는 대부분의 대답. 이같은 설명은 시도_횟수 사용하지 않고, 이 같은 답변을 통해 / story:
미국 중앙정보국 (cia) 이 있는 정보를 사용할 수 있게 하는 일반 대중에게 위부의 미 중앙정보국 (cia) 이라고 부른다. attributes.
미 중앙정보국 (cia) 의 경우, 대부분의 속성은 only" 검토완료 ";). 즉, , 외부 파티였죠 경우에는 cia 국장은 미 중앙정보국 (cia), ask: " 누구이뇨? " 수 있습니다. 그리고 올바른 답을 얻을 수 있습니다. 하지만, 어떻게 처리해야 " 너희는너희가 cannot 검토완료 only". 미 중앙정보국 (cia) 특성을 변경하려면 변화가 있다. 예를 들어 갑자기 decide delaymins 전화를 사용할 수 있도록 할 수 있는 패리스 힐튼이 디렉터, 킴 카다시안 커맨더 인 치프.
만약 속성뿐 제공했음 너회가 " write"; 액세스 할 수 있는 그런 경우에도 수정하시기 스케쳐내 조교하실 바깥쪽인지가. 그렇지 않으면 할 수 있는 유일한 읽어옵니다.
즉, 또는 그, 그렇지 않으면 할 수 있도록 관련 접근자에 수정하시기 조직에게 여부에 따라 접근자가 읽고 쓸 수 없는 외부 명 접근자에.
정확한 com/go/4e6b330a_kr 액세스하려면 속성 및 메서드, 그 안에 자신의 능력을 클래스와 같은 것입니다. 하스! 내가 할 수 있고, 모든 질문에 하나님께용서를 desktopplatforms 바란다 "고 해명했다.
Setter 와 getter 메서드 개념, OOP 익숙하다면 익숙한 합니다. 초기의 attr_accessor 높여줍니까 루비.
class Person
def name
@name
end
def name=(str)
@name = str
end
end
person = Person.new
person.name = 'Eshaan'
person.name # => "Eshaan"
def name=(val)
@name = val
end
def name
@name
end
class Person
attr_accessor :name
end
person = Person.new
person.name = "Eshaan"
person.name # => "Eshaan"
물론 내가 이 문제를 다소 긴 이 질문의 답을 쓴 바 있다. 하지만 이에 대한 자세한 설명, 누구나 답을 이미 몇 가지 큰 도움이 될 수 있는 제 대답은 좋겠다
메서드로부터 초기화하지
데이터 오브젝트 생성 시 인스턴스입니다 초기화하지 설정할 수 있는 것보다 인스턴스입니다 그녀들을 위해 다른 줄에 코드에 새로운 클래스의 인스턴스를 만들 때마다.
class Person
def initialize(name)
@name = name
end
def greeting
"Hello #{@name}"
end
end
person = Person.new("Denis")
puts person.greeting
위의 코드에서 사용하는 방법 중 이름이 "데니스" 우리는 설정을 통해 초기화하지 반군지역 데니스 초기화하지 매개변수입니다. 만약 우리가 이름을 설정할 수 없는 게 우리가 할 수 있는 방법을 초기화하지 승인하십시오 다음과 같습니다.
class Person
attr_accessor :name
# def initialize(name)
# @name = name
# end
def greeting
"Hello #{name}"
end
end
person = Person.new
person.name = "Dennis"
puts person.greeting
위의 코드에서 (person.name) 를 사용하여 메서드를 호출하여 설정했습니다 이름 값을 설정하는 대신, 세터 attr_accessor 빛위에 초기화하지 객체에는.
둘 다 "방법" 이 일을 수행하는 코드는 초기화하지 고객이시간과 수 있게 해 줍니다.
이거밖에 초기화하지 있다. 방법으로 초기화하지 전화를 걸 수 없습니다. 실제로 내려받습니다 값을 사용해야 할 때 게터 인스턴스를 객체 및 세터 (attr_reader (get), attr_writer (설정), 그리고 attr_accessor (모두)). 자세한 내용은 아래 사람들에 대해.
게터, 세터 (, attr_writer attr_reader attr_accessor)
게터, attr_reader: 전체 목적은 특정 인스턴스 변수 값을 되돌려줍니다 getter 것입니다. Dell. 아래의 예제 코드를 kingdome. seattle. 여기있을 알 수 있습니다.
class Item
def initialize(item_name, quantity)
@item_name = item_name
@quantity = quantity
end
def item_name
@item_name
end
def quantity
@quantity
end
end
example = Item.new("TV",2)
puts example.item_name
puts example.quantity
메서드 호출 중인 코드에서 그들위에 "item_name" 와 "양" 을 인스턴스입니다 항목설명프로세서 "예". 이 "는 example.item_name" 와 "에스타 플레윈촨티티" 반환되므로 (또는 "get") 의 값은 "예" 로 전달된 매개변수입니다 그들을 및 디스플레이 화면에.
다행히도 이 방법을 쓸 수 있게 하는 더 근본적인 문제가 있는 루비 코드 간단히. 이 attr_reader 메서드입니다. 아래 코드는 참조.
class Item
attr_reader :item_name, :quantity
def initialize(item_name, quantity)
@item_name = item_name
@quantity = quantity
end
end
item = Item.new("TV",2)
puts item.item_name
puts item.quantity
이 구문은 작동됨 똑같이 6 만 이 코드는 수 있게 해 줍니다. 이매진 했을 경우, 5 개 항목 클래스 스테이드 있기 때문인 것으로 풀이된다. 이 코드는 기절해있는 빠르게 얻을 수 있을 것 "이라고 말했다.
세터, attr_writer: 처음에는 어떤 초과 me up 할당 메서드를 사용하여 동일한 기능을 수행할 수 있는 것은 내 눈을 듯했다 초기화하지 메서드입니다. 내가 내 이해를 바탕으로 아래 차이를 설명한다.
앞서 설명한 것처럼, 이 방법을 사용하면 초기화하지 인스턴스입니다 계시노라 시 개체를 객체에는 값을 설정할 수 있습니다.
하지만 와일드링이 후에, 하고 싶은 값을 설정합니다 인스턴스입니다 창조되었으되 또는 변경하십시오 후에는 초기화되었습니다? 이 경우를 약간만이라도 세터 방법을 사용할 수 있습니다. 즉 말한다. "Set" 특정 상태에서 너회가 필요없다우 attr_writer 방법을 사용하는 경우 된다.
아래 코드는 예는 세터 방법을 사용하여 가치를 너희가운데 item_name 엔드입니다 인스턴스에서는 항목 클래스. 우리가 계속 사용할 수 있게 내려받습니다 attr_reader 디이브이 getter 메서드 및 인쇄 그 값이 화면에 만일의 사태에 대비해 운영까지도 코드를 테스트하려면 자체적으로.
class Item
attr_reader :item_name
def item_name=(str)
@item_name = (str)
end
end
아래 코드는 attr_writer 사용 예는 우리에게 다시 한번 우리 코드 및 저장 줄여집니다 하게하면서요.
class Item
attr_reader :item_name
attr_writer :item_name
end
item = Item.new
puts item.item_name = "TV"
아래 코드는 는 반복 초기화하지 의 값을 설정할 수 있는 uxfs 위에 객체에는 빛위에 계시노라 item_name 초기화하지 사용하고 있습니다
class Item
attr_reader :item_name
def initialize(item_name)
@item_name = item_name
end
end
item = Item.new("TV")
puts item.item_name
attr_accessor: 모두 한 번 더 선) 의 기능을 수행하는 attr_reader 및 attr_writer 절약하는 코드.
부품 뭐한테 루비아츠 / 프로그래머 (나 같은) 는 새로운 인간으로 생각한다.
조금 더 일반화 클릭할 수 있지만, this is how it for me.
주어진:
class Person
end
우리는 그 이름을 , t # 39 로 정의된 haven& 생각하신거야 또는 다른 특성을 가질 수 있는 일이 아니다.
만일 그런 다음:
baby = Person.new
.and 전달자로써 시도하시겠습니까 그 이름.
baby.name = "Ruth"
, 오류 때문에 루비랜드 우리가 받을 수 있는 사람이 할 수 있는 객체의 클래스를 연결된 " name", 또는 일이 아니다. . 아직!
그러나 우리는 모든 것을 사용할 수 있는 방안으로 말하도다 " 서버리스 (이전 답변 참조) 한 클래스 ('baby') , 인스턴스입니다 & # 39 라는 속성을 가지고 있습니다,, # 39 name& 그리하매 하나님이 아니라 구문 가져오고 설정하는 방법은 그 이름을 가지고 있지만, 우리가 할 공감하는 so.".
물론 일반 ᄀ형강, 그러나 나는 이 질문을 약간 다른 등을 통해 다시 희망을 발견한 사람이 그 다음 인스턴스에서는 클래스용 진격을 이 이렇게 하면 어떨까.
간단히 말해 setter 와 getter 정의하시려면 클래스에 대한 것입니다.
참고로
attr_reader :v is equivalant to
def v
@v
end
attr_writer :v is equivalant to
def v=(value)
@v=value
end
그래서
attr_accessor :v which means
attr_reader :v; attr_writer :v
에키바란트 setter 와 getter 클래스에 대한 정의할 수 있다.
다른 방법으로 분석할 수 있는 것은 이해할 수 있도록 함으로써 '' attr_accessor 오류 코드 않습니다.
예:
class BankAccount
def initialize( account_owner )
@owner = account_owner
@balance = 0
end
def deposit( amount )
@balance = @balance + amount
end
def withdraw( amount )
@balance = @balance - amount
end
end
다음 방법을 사용할 수 있습니다.
$ bankie = BankAccout.new("Iggy")
$ bankie
$ bankie.deposit(100)
$ bankie.withdraw(5)
다음 방법을 던지는 오류:
$ bankie.owner #undefined method `owner'...
$ bankie.balance #undefined method `balance'...
, '와' 균형 '이 아닌' 소유자에게도 메서드입니다 있지만, 엄밀히 말해 특성입니다. '정의' 와 'def 밸런싱할 소유자에게도 뱅크스카운트 클래스 없는'. 만약 그렇다면, 그 아래 두 개의 명령을 사용할 수 있습니다. 그러나 그 두 가지 방법을 aren& # 39, t 할 수 있다. 그러나 # 39 you& 것처럼 속성뿐 액세스하면 수 있습니다; d '를 통해 액세스하면 메서드입니다 attr_accessor'!! 따라서 단어 'attr_accessor' . 속성. 액세서의. It 액세스하며 때와 같은 속성을 액세스하면 메서드입니다.
',' 추가 attr_accessor 밸런싱할 소유자 읽기 및 쓰기 '균형' 와 '주인의 " method" 수 있습니다;;). 이제 마지막 2 방법을 사용할 수 있습니다.
$ bankie.balance
$ bankie.owner
두 개의 사용 가능한 방법을 사용하면 액세서의 lc-fc attr_accessor 요약하십시오 속성은 수.
자바 가상 머신 (jvm) 에 전화를 받는 등 게터 및 세터.
그래서 그냥 좋은 사례가 될 많은 답변 표시한 I& # 39 m, 개요.
및
옛날 루비 docs 해시 태그를 # 고말은 메서드입니다. 클래스 이름을 접두어입니다 포함할 수도 있습니다.
나는 그냥 한ᆞ미 다음 불확실성 이해하는 새로운 루비 · 했다. 다른 사람이 아웃해야 미래에 도움이 됩니다. 결국 이는 위에서 언급한 것과, 여기서 2 기능 (def 마이바르, 데프 마이바르 =) 를 얻을 수 있지만, 이러한 방법은 모두 암시적으로 @myvar 액세스하면 무시됨 각 지역 선언.
class Foo
attr_accessor 'myvar'
def initialize
@myvar = "A"
myvar = "B"
puts @myvar # A
puts myvar # B - myvar declared above overrides myvar method
end
def test
puts @myvar # A
puts myvar # A - coming from myvar accessor
myvar = "C" # local myvar overrides accessor
puts @myvar # A
puts myvar # C
send "myvar=", "E" # not running "myvar =", but instead calls setter for @myvar
puts @myvar # E
puts myvar # C
end
end
속성은 외부에서 https://learning. 구성 요소를 클래스 개체. 그들은 대부분의 다른 프로그래밍 언어에서 속성를) 으로 알려져 있다. 그 값을 사용하여, object_name.attribute_name. 같이 joyon. notation" " 액세스할 수 있습니다. 파이썬, 루비, 몇 개 국어로 달리 직접 액세스되기 위부의 객체에는 인스턴스 변수 스크램블된 허용하지 않습니다.
class Car
def initialize
@wheels = 4 # This is an instance variable
end
end
c = Car.new
c.wheels # Output: NoMethodError: undefined method `wheels' for #<Car:0x00000000d43500>
위의 예에서 캜 인스턴스입니다 (객체) 차 구분된다. 외부에서 객체에는 바퀴고요 인스턴스 변수 값을 시도했을 읽는 데 실패했다. 무슨 일이유 시도한 것은 루비 호츨 메서드입니다 release. 바퀴고요 있지 않지만, 이 방법 내에서 캜 객체에는 정의했습니다. 한마디로 호츨 메서드입니다 release. attribute_name 오브젝트 내의 object_name.attribute_name 시도합니다. 외부에서 구현하십시오 바퀴고요 변수 값을 액세스하려면 우리가 할 수 있는 방법, 그 때 그 이름을 인스턴스 변수 값을 되돌려줍니다 불렀으매. # 39 의 불렀으매 that& 충족되었으며 액세서의 메서드입니다. [일반, 일반적인 프로그래밍 컨텍스트로 인스턴스 변수는 액세스하려면 외부에서 객체인지 구현할 수 있는 방법, 소트트웨어용 액세서의 getter 및 할당 메서드를. A class 에서 정의된 변수의 값을 getter 통해 읽을 수 있고 외부에서 세터 외부에서 기록되었으므로 수 있다.
다음 예에서는, 우리는 getter 및 할당 메서드를 추가되든지 차에 클래스용 바퀴고요 액세스하려면 외부에서 가변적입니다 객체에는. 루비 way" " 아닙니다;; 세터 게터 및 정의. 이를 설명하기 위해 어떤 역할만 getter 및 할당 메서드를 책임질래.
class Car
def wheels # getter method
@wheels
end
def wheels=(val) # setter method
@wheels = val
end
end
f = Car.new
f.wheels = 4 # The setter method was invoked
f.wheels # The getter method was invoked
# Output: => 4
위의 예제 코드를 작성하는 데 사용되는 작동됨 및 이와 유사한 방법으로 흔히 getter 및 세터 '로 끝난다. 그러나, 루비 이렇게 간단한 방법을 제공합니다. 세 가지 기본 제공 및 방법, attr_writer attr_reader 불렀으매 attr_acessor. 이 방법을 쓸 수 있도록 만드는 attr_reader 외부에서 attr_writer 판독값 인스턴스 변수 및 attr_acessor 읽고 쓸 수 있습니다.
위의 예제를 다음과 같이 다시 쓰일 수 있다.
class Car
attr_accessor :wheels
end
f = Car.new
f.wheels = 4
f.wheels # Output: => 4
위의 예에서 바퀴고요 속성용 외부에서 객체에는 읽고 쓸 수 있는 것입니다. 대신 사용할 경우, 우리는 attr_reader 읽기 전용 attr_accessor 것 "이라고 했다. 만약 우리가 attr_writer 읽기 전용 사용할 것 "이라고 했다. 그 때 자신이 만든 '라는 세 가지 방법이 있지만, 스스로 세터 않습니다를 게터 의 setter 와 getter 메서드 및 우리를 위해. 동적으로 생성하는 방법, 다른 이들은 메서드입니다 (프로그래밍) # 39 의 불렀으매 that& 메타프로그래밍.
예를 들어, 첫 번째 (moray) 에 내장된 방법을 쓸 수 없는 Ruby& # 39 의 setter 와 getter 메서드 추가 코드는 필요한 경우에만 사용해야 합니다. 예를 들어, 또는 몇 가지 값을 계산 데이터를 검증할 필요가 있습니다 세터 메서드로부터 할당하기 전에 인스턴스 변수는.
액세스하려면 가능하다 (읽기 및 쓰기) 에서 인스턴스 변수 및 instance_variable_set 사용하여 위부의 객체에는 instance_variable_get 내장현 방법. 그러나 이는 정당한 거의 사용하지 않고, 보통 등 온갖 나쁜 아이디어 캡슐화 혼란을 초래할 수 있다는 점도 문제로 지적되고 있다.
아이반. 많은 좋은 답변. 이것은 내 몇 센트 때문이다.
'attr_accessor 우리에게 주는 간단한 방법' 이 (가) 의 정리 ( 건조한 ing ) 까지 리피팅 'getter 및 setter' 방법.
좀 더 집중할 수 있게 먹어서나 비즈니스 로직과 세터 및 게터 걱정 없습니다.
ᄋ "이번 도움을 주었다.