루비에서 attr_accessor란 무엇입니까?
을 겪고 .attr_accessor루비로.
누가 나에게 이것을 설명해 줄 수 있습니까?
이 있다고 치자.Person.
class Person
end
person = Person.new
person.name # => no method error
는 방법을 한 적이 .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읽기 및 쓰기 방법을 사용합니다.하지만, 이것은 매우 자주 행해지는데, 왜 매번 이런 방법을 쓰는 데 시간을 낭비합니까?우리는 더 쉽게 할 수 있습니다.
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_reader,attr_writer,그리고.attr_accessor메소드는 실제로 메소드를 생성하고, 다른 답변, 책, 루비 문서를 읽습니다.
trtr_accessor는 메소드일 뿐입니다. (링크는 어떻게 작동하는지에 대한 더 많은 통찰력을 제공해야 합니다 - 생성된 메소드 쌍을 살펴보십시오. 그리고 튜토리얼에서 이 메소드를 사용하는 방법을 보여주어야 합니다.)
그 ㅠㅠclass는 Ruby의 정의가 아니지만(C++ 및 Java와 같은 언어에서는 "단순한 정의"임) 평가하는 표현입니다.이 평가 중에 다음과 같은 경우가 있습니다.attr_accessor클래스를 합니다. 수신기를 하십시오. 암시적 수신기를 기억하십시오.self.attr_accessor서, 디에어self이 시점에서 "열린" 클래스 개체입니다.
의 attr_accessor그리고 친구들은, 음:
Ruby는 Smalltalk와 마찬가지로 인스턴스 변수가 해당 개체의 메서드 외부에1 액세스할 수 없도록 합니다.즉, 인스턴스 변수는 에서 액세스할 수 없습니다.
x.yJava 또는 심지어 Python에서 흔히 볼 수 있는 형태입니다. Ruby 인비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
루비에서 직접 이런 종류의 방법을 작성할 수 있습니다.
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
그것은 물체에 대한 게터/세터에 지나지 않습니다.
기본적으로 그들은 공개적으로 접근할 수 있는 데이터 속성을 위조하지만, Ruby는 가지고 있지 않습니다.
인스턴스 변수에 대한 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
OOP 개념에 익숙하다면 getter와 setter 방법을 숙지해야 합니다.trtr_accessor는 Ruby에서도 동일한 작업을 수행합니다.
일반적인 방법으로 게터와 세터
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"
코드 없이 간단한 설명
위 답변의 대부분은 코드를 사용합니다.이 설명은 유추/이야기를 통해 아무 것도 사용하지 않고 답하려고 합니다.
외부 당사자는 내부 CIA 비밀에 접근할 수 없습니다.
정말 비밀스러운 장소를 상상해보죠. CIA입니다.CIA 내부 사람들 말고는 아무도 CIA에서 무슨 일이 일어나고 있는지 모릅니다.다시 말해, 외부 사람들은 CIA의 어떤 정보에도 접근할 수 없습니다.하지만 완전히 비밀인 조직을 갖는 것은 좋지 않기 때문에, 특정 정보는 외부 세계에 제공됩니다. 물론 CIA가 모든 사람들에게 알려주기를 원하는 유일한 것입니다. 예를 들어, CIA 국장, 이 부서가 다른 모든 정부 부처와 비교했을 때 얼마나 환경 친화적인지 등입니다.다른 정보: 예를 들어 이라크나 아프가니스탄의 비밀 공작원들은 아마도 향후 150년 동안 비밀로 남을 것입니다.
CIA 외부에 있는 경우 CIA가 공개한 정보에만 액세스할 수 있습니다.또는 CIA 용어를 사용하려면 "지운" 정보에만 액세스할 수 있습니다.
CIA가 CIA 밖의 일반 대중들에게 제공하고자 하는 정보를 속성이라고 합니다.
읽기 및 쓰기 특성의 의미:
CIA의 경우 대부분의 속성은 "읽기 전용"입니다.이것은 만약 당신이 CIA의 외부 당사자라면, "CIA의 국장이 누구인가?"라고 물을 수 있다는 것을 의미합니다. 그러면 당신은 솔직한 대답을 얻을 수 있을 것입니다.그러나 "읽기 전용" 특성으로는 CIA를 변경할 수 없습니다. 예를 들어 전화를 걸 수 없고 갑자기 킴 카다시안을 국장으로 임명하거나 패리스 힐튼을 최고 사령관으로 임명하기로 결정할 수 없습니다.
속성이 "쓰기" 권한을 부여한 경우, 외부에 있더라도 원하는 경우 변경할 수 있습니다.그렇지 않으면, 당신이 할 수 있는 유일한 것은 읽는 것입니다.
즉, 액세스 권한을 사용하면 액세스 권한이 읽기 또는 쓰기 액세스 권한인지에 따라 외부 사용자가 들어오지 못하도록 하는 조직에 문의하거나 변경할 수 있습니다.
클래스 내부의 개체는 서로 쉽게 액세스할 수 있습니다.
- 반면에, 만약 당신이 이미 CIA 안에 있었다면, 당신은 카불에 있는 CIA 요원에게 쉽게 전화할 수 있었을 것입니다. 왜냐하면 당신이 이미 안에 있기 때문에 이 정보는 쉽게 접근할 수 있기 때문입니다.그러나 CIA 외부에 있는 경우에는 단순히 액세스 권한이 주어지지 않습니다. 사용자는 그들이 누구인지 알 수 없고(읽기 액세스), 사용자의 임무를 변경할 수 없습니다(쓰기 액세스 권한을 변경할 수 없습니다.
클래스와 그 안에 있는 변수, 속성 및 방법에 접근하는 능력에 대해서도 정확히 같은 것입니다. HTH! 질문이 있으시면 질문해 주십시오. 그리고 제가 명확히 할 수 있기를 바랍니다.
저도 이 문제에 직면했고 이 질문에 대해 다소 긴 답변을 썼습니다.이미 이에 대한 몇 가지 훌륭한 답변이 있지만, 더 명확한 설명을 원하는 사람은 제 답변이 도움이 될 수 있기를 바랍니다.
초기화 방법
Initialize를 사용하면 클래스의 새 인스턴스를 만들 때마다 코드의 별도 행에 데이터를 설정할 필요 없이 인스턴스를 만들 때 개체의 인스턴스로 데이터를 설정할 수 있습니다.
class Person
def initialize(name)
@name = name
end
def greeting
"Hello #{@name}"
end
end
person = Person.new("Denis")
puts person.greeting
위의 코드에서 Dennis를 Initialize의 매개 변수를 통해 초기화 방법을 사용하여 "Denis"라는 이름을 설정하고 있습니다.초기화 방법을 사용하지 않고 이름을 설정하려면 다음과 같이 할 수 있습니다.
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 setter 메서드를 호출하여 이름을 설정합니다.
이 작업을 수행하는 "방법"과 초기화는 모두 시간과 코드 행을 절약합니다.
초기화 작업은 이것뿐입니다.메서드로 초기화를 호출할 수 없습니다.인스턴스 개체의 값을 실제로 가져오려면 getter와 setter(attr_reader(get)), atr_writer(set) 및 atr_accessor(둘 다)를 사용해야 합니다.자세한 내용은 아래를 참조하십시오.
Getters, Setters(attr_reader, attr_writer, attr_accessor)
Getters, attr_reader:Getter의 전체 목적은 특정 인스턴스 변수의 값을 반환하는 것입니다.이에 대한 자세한 내용은 아래 샘플 코드를 참조하십시오.
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
위의 코드에서 항목 인스턴스의 메서드를 "tem_name" 및 "quantity"라고 부릅니다."example.item_name" 및 "example"을 입력합니다."quantity"는 "module"에 전달된 매개 변수의 값을 반환(또는 "취득")하여 화면에 표시합니다.
다행히도 루비에는 이 코드를 더 간결하게 작성할 수 있는 고유한 방법인 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:처음에 세터 방법으로 저를 괴롭혔던 것은 제 눈에는 초기화 방법과 동일한 기능을 수행하는 것처럼 보였기 때문입니다.아래에서는 제가 이해한 내용을 바탕으로 차이점을 설명합니다.
앞에서 설명한 것처럼 초기화 방법을 사용하면 개체를 만들 때 개체 인스턴스의 값을 설정할 수 있습니다.
그러나 인스턴스가 생성된 후 나중에 값을 설정하거나 초기화된 후 값을 변경하려면 어떻게 해야 합니까?이것은 세터 방법을 사용하는 시나리오입니다.그것이 차이점입니다.처음에 attr_writer 메서드를 사용할 때는 특정 상태를 "설정"할 필요가 없습니다.
아래 코드는 setter 메서드를 사용하여 Item 클래스의 이 인스턴스에 대해 item_name 값을 선언하는 예제입니다.만약 당신이 스스로 코드를 테스트하고 싶을 때를 대비하여 우리가 값을 가져와서 화면에 인쇄할 수 있도록 우리는 getter method attr_reader를 계속 사용합니다.
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"
아래 코드는 생성 시 item_name의 objects 값을 설정하기 위해 initialize를 사용하고 있는 위의 초기화 예제를 반복한 것입니다.
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의 기능을 모두 수행하여 코드 한 줄을 더 저장합니다.
(나와 같은) 새로운 루비스트/프로그래머들을 혼란스럽게 하는 부분은 다음과 같습니다.
"특정 속성(예: 이름)을 가진 인스턴스를 알려주고 해당 속성에 값을 한 번에 지정할 수 없는 이유는 무엇입니까?"
조금 더 일반화되었지만, 저는 이렇게 클릭했습니다.
주어진:
class Person
end
우리는 사람을 그 문제에 대한 이름이나 다른 속성을 가질 수 있는 것으로 정의하지 않았습니다.
그래서 만약 우리가:
baby = Person.new
...그리고 그들에게 이름을 지어주려고 노력합니다...
baby.name = "Ruth"
루비랜드에서 개체의 사용자 클래스는 아직 "이름"과 연관되거나 "이름"을 가질 수 있는 것이 아니기 때문에 오류가 발생합니다.
방법 중 클래스의 of a personclass라고 말할 수 .baby) 이제 'name'이라는 속성을 가질 수 있으므로 해당 이름을 가져오고 설정할 수 있는 구문적인 방법이 있을 뿐만 아니라 그렇게 하는 것이 타당합니다.
다시 말씀드리지만, 조금 더 일반적인 각도에서 이 질문을 다루지만, 저는 이것이 이 스레드로 가는 길을 찾는 클래스 사람의 다음 인스턴스에 도움이 되기를 바랍니다.
간단히 말해서 수업에 대한 세터와 게터를 정의할 것입니다.
참고:
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
클래스에 대한 세터 및 게터를 정의하는 것과 같습니다.
단히간attr-accessor.getter그리고.setter는 " " " " 입니다.
이를 이해하는 또 다른 방법은 어떤 오류 코드를 제거하는지 파악하는 것입니다.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'...
owner그리고.balance기술적으로는 메소드가 아니라 속성입니다.은행 계좌 클래스에 다음이 없습니다.def owner그리고.def balance그런 경우 아래의 두 가지 명령을 사용할 수 있습니다.하지만 그 두 가지 방법은 존재하지 않습니다.그러나 다음을 통해 메소드에 액세스하는 것처럼 속성에 액세스할 수 있습니다.attr_accessor그래서 '속성'이라는 단어.접근자.메소드에 액세스하는 것처럼 속성에 액세스합니다.
추가하기attr_accessor :balance, :owner읽고 쓸 수 있습니다.balance그리고.owner 두 방법을 할 수 .이제 마지막 두 가지 방법을 사용할 수 있습니다.
$ bankie.balance
$ bankie.owner
기존 답변의 수가 많음에도 불구하고, 그 중 어느 것도 여기에 관련된 실제 메커니즘을 설명할 수 없는 것 같습니다.메타프로그래밍입니다. 다음 두 가지 사실을 활용합니다.
모듈/클래스를 즉시 수정할 수 있습니다.
모듈/클래스 선언 자체가 실행 가능한 코드입니다.
자, 다음을 상상해 보십시오.
class Nameable
def self.named(whatvalue)
define_method :name do whatvalue end
end
end
클래스 메소드를 선언합니다. named값과 함께 호출되면 인스턴스 메서드가 생성됩니다.name값을 반환합니다.그것이 메타프로그래밍 부분입니다.
이제 해당 클래스를 하위 클래스로 분류합니다.
class Dog < Nameable
named "Fido"
end
도대체 우리가 뭘 한 거죠?클래스 선언에서 실행 가능한 코드는 클래스를 참조하여 실행됩니다. 맨 래서맨 말은그.named 메소드 실로클메대소호한출다니입에드래스제는▁▁to▁the▁method▁에 대한 호출입니다.named."Fido"의론대로
방법은 입니까?named은 래요그라고 불리는 요? 그것은 인스턴스 메소드를 만듭니다.name값을 반환합니다.그래서 하는 을 가지고 : 이제, 뒤는서에다음같자과사방다은용니합법을는▁so▁that자사다니:용.
def name
"Fido"
end
나를 믿지 않나요?그럼 이 작은 움직임을 보세요.
puts Dog.new.name #=> Fido
내가 왜 당신에게 그 모든 것을 말했습니까?내가 방금 한 일이named 것은 하게 네테이블무정엇까니입히확의거은?attr_accessor모듈에 대해 수행합니다.라고 말할 때attr_accessor인스턴스 메서드를 만드는 클래스 메서드(모듈에서 상속됨)를 호출합니다.특히 사용자가 이름을 인수로 제공하는 인스턴스(instance) 속성에 대한 게터 및 세터 메서드를 생성하므로 이러한 게터 및 세터 메서드를 직접 작성할 필요가 없습니다.
이 모듈에 대한 명명된 특성을 정의합니다. 여기서 이름은 symbol.id2name이며 인스턴스 변수(@name)를 만들고 이를 읽을 수 있는 액세스 방법을 만듭니다.또한 name=이라는 메서드를 만들어 속성을 설정합니다.
module Mod
attr_accessor(:one, :two)
end
Mod.instance_methods.sort #=> [:one, :one=, :two, :two=]
속성 접근자를 요약하면 attr_accessor라는 이름으로 두 가지 무료 메서드를 제공합니다.
자바처럼 그들은 게터와 세터라고 불립니다.
많은 답변들이 좋은 예를 보여주었기 때문에 간단히 말씀드리겠습니다.
#그들
그리고.
#the_values=
이전 루비 문서에서 해시 태그 #는 메서드를 의미합니다.클래스 이름 접두사를 포함할 수도 있습니다...MyClass #my_method
저는 루비가 처음이라 다음과 같은 이상함을 이해하는 것을 처리해야 했습니다.미래에 다른 사람을 도울 수도 있습니다.결국 위에서 언급한 것처럼 @myvar에 액세스하기 위해 두 개의 함수(def myvar, 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
속성 및 접근자 메서드
특성은 개체 외부에서 액세스할 수 있는 클래스 구성 요소입니다.다른 많은 프로그래밍 언어에서는 속성으로 알려져 있습니다.이러한 값은 object_name.attribute_name에서와 같이 "도트 표기법"을 사용하여 액세스할 수 있습니다.Python 및 몇몇 다른 언어와 달리 Ruby는 객체 외부에서 인스턴스 변수에 직접 액세스할 수 없습니다.
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>
위 예제에서 c는 Car 클래스의 인스턴스(개체)입니다.개체 외부에서 휠 인스턴스 변수 값을 읽으려고 시도했지만 실패했습니다.Ruby가 c 객체 내에서 wheels라는 이름의 메서드를 호출하려고 했지만 정의되지 않았습니다.즉, object_name.attribute_name은 개체 내에서 attribute_name이라는 메서드를 호출하려고 합니다.외부에서 휠 변수 값에 액세스하려면 호출 시 해당 변수 값을 반환하는 인스턴스 메서드를 해당 이름으로 구현해야 합니다.그것을 접근법이라고 합니다.일반적인 프로그래밍 컨텍스트에서 객체 외부에서 인스턴스 변수에 액세스하는 일반적인 방법은 getter 및 setter 메서드라고도 하는 접근자 메서드를 구현하는 것입니다.Getter는 클래스 내에서 정의된 변수의 값을 외부에서 읽을 수 있도록 하고 Setter는 외부에서 쓸 수 있도록 합니다.
다음 예제에서는 객체 외부에서 휠 변수에 액세스할 수 있도록 차량 클래스에 getter 및 setter 방법을 추가했습니다.이것은 게터와 세터를 정의하는 "루비 방식"이 아닙니다. 게터와 세터 방법이 무엇을 하는지 설명하는 역할만 합니다.
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 및 setter 메서드를 만드는 데 사용됩니다.그러나 Ruby는 이를 위한 더 간단한 방법을 제공합니다: attr_reader, attr_writer 및 attr_acessor라는 세 가지 기본 제공 메서드입니다.attr_reader 메서드는 인스턴스 변수를 외부에서 읽을 수 있게 하고, attr_writer는 쓸 수 있게 하며, attr_acessor는 읽을 수 있고 쓸 수 있게 합니다.
위의 예는 이렇게 다시 작성할 수 있습니다.
class Car
attr_accessor :wheels
end
f = Car.new
f.wheels = 4
f.wheels # Output: => 4
위의 예에서 wheels 특성은 객체 외부에서 읽고 쓸 수 있습니다.attr_accessor 대신 attr_reader를 사용하면 읽기 전용이 됩니다.만약 우리가 tr_writer를 사용한다면, 그것은 쓰기 전용일 것입니다.이 세 가지 방법은 그 자체로 게터와 세터가 아니라, 호출될 때 우리를 위한 세터와 세터 방법을 만듭니다.그것들은 동적으로 (프로그램적으로) 다른 방법들을 생성하는 방법입니다. 그것은 메타프로그래밍이라고 불립니다.
Ruby의 내장 메서드를 사용하지 않는 첫 번째 (더 긴) 예제는 getter 및 setter 메서드에 추가 코드가 필요한 경우에만 사용해야 합니다.예를 들어, 세터 방법은 인스턴스 변수에 값을 할당하기 전에 데이터의 유효성을 검사하거나 계산을 수행해야 할 수 있습니다.
instance_variable_get 및 instance_variable_set 기본 제공 메서드를 사용하여 개체 외부에서 인스턴스 변수에 액세스(읽기 및 쓰기)할 수 있습니다.그러나 캡슐화를 우회하면 모든 종류의 혼란이 발생하는 경향이 있기 때문에 이것은 거의 정당화되지 않으며 대개 나쁜 생각입니다.
좋은 답변이 많군요여기 제 몇 푼짜리 동전이 있습니다.
attr_accessor반복 방법을 정리(DRY-ING)하는 데 도움이 되는 간단한 방법입니다.그래서 우리는 비즈니스 로직을 작성하는 데 더 집중하고 세터와 세터에 대해 걱정하지 않을 수 있습니다.
attr_accessor의 주요 기능은 다른 파일의 데이터에 액세스하는 기능입니다.
그래서 당신은 보통 trr_reader나 atr_writer를 가지고 있을 것이지만 좋은 소식은 Ruby가 당신이 이 두 가지를 trr_accessor와 함께 결합할 수 있게 해준다는 것입니다.둥글거나 다재다능하기 때문에 저는 그것을 저의 투고 방법으로 생각합니다.또한 Rails에서는 백엔드에서 이 기능이 사용자에게 제공되기 때문에 제거된다는 것을 기억하십시오.즉, 다른 두 개보다 trtr_acessor를 사용하는 것이 더 낫다는 것입니다. 왜냐하면 특정한 것에 대해 걱정할 필요가 없기 때문입니다. 접근자가 모든 것을 커버하기 때문입니다.이것이 일반적인 설명에 가깝다는 것을 알지만 초보자로서 도움이 되었습니다.
이것이 도움이 되었기를 바랍니다!
언급URL : https://stackoverflow.com/questions/4370960/what-is-attr-accessor-in-ruby
'programing' 카테고리의 다른 글
| TypeScript에서 참조를 사용할 때, 가져오기를 사용할 때는 언제입니까? (0) | 2023.06.12 |
|---|---|
| Node.js는 경로가 파일인지 디렉토리인지 확인합니다. (0) | 2023.06.12 |
| 왜 이것은 유형 불일치가 아닌가요? (0) | 2023.06.12 |
| '!:'와 '의 차이점은 무엇입니까?TypeScript 개체 정의에서? (0) | 2023.06.12 |
| 설치된 종속성에서 @types 유형 제외 (0) | 2023.06.07 |