클래스 변수에 대한 Attr_accessor
attr_accessor
다음 코드에서는 작동하지 않습니다. 오류는 " undefined method 'things' for Parent:Class (NoMethodError)
":
class Parent
@@things = []
attr_accessor :things
end
Parent.things << :car
p Parent.things
그러나 다음 코드는 작동합니다.
class Parent
@@things = []
def self.things
@@things
end
def things
@@things
end
end
Parent.things << :car
p Parent.things
attr_accessor
인스턴스에 대한 접근 자 메서드를 정의합니다. 클래스 레벨 자동 생성 접근자를 원한다면 메타 클래스에서 사용할 수 있습니다.
class Parent
@things = []
class << self
attr_accessor :things
end
end
Parent.things #=> []
Parent.things << :car
Parent.things #=> [:car]
그러나 이것은 클래스 변수가 아닌 클래스 수준 인스턴스 변수를 생성 합니다. 클래스 변수가 상속을 처리 할 때 예상 할 수있는 것과 다르게 동작하기 때문에 이것은 어쨌든 원하는 것일 수 있습니다. " Ruby의 클래스 및 인스턴스 변수 "를 참조하십시오 .
attr_accessor
인스턴스 변수에 대한 접근자를 생성 합니다. Ruby의 클래스 변수는 매우 다르며 일반적으로 원하는 것이 아닙니다. 여기서 원하는 것은 클래스 인스턴스 변수입니다. 다음 attr_accessor
과 같이 클래스 인스턴스 변수와 함께 사용할 수 있습니다 .
class Something
class <<self
attr_accessor :things
end
end
그런 다음 쓸 수 Something.things = 12
있고 작동합니다.
설명 : 클래스 변수는 attr_accessor
. 인스턴스 변수에 관한 모든 것 :
class SomeClass
class << self
attr_accessor :things
end
@things = []
end
Ruby에서 class는 클래스 "Class"(하나님, 나는 그것을 좋아합니다)의 attr_accessor
인스턴스이고 인스턴스 변수에 대한 접근 자 메서드를 설정하기 때문입니다.
이것은 아마도 가장 간단한 방법 일 것입니다.
class Parent
def self.things
@@things ||= []
end
end
Parent.things << :car
p Parent.things
Аlso note that a singleton method is a method only for a single object. In Ruby, a Class is also an object, so it too can have singleton methods! So be aware of when you might be calling them.
Example:
class SomeClass
class << self
def test
end
end
end
test_obj = SomeClass.new
def test_obj.test_2
end
class << test_obj
def test_3
end
end
puts "Singleton methods of SomeClass"
puts SomeClass.singleton_methods
puts '------------------------------------------'
puts "Singleton methods of test_obj"
puts test_obj.singleton_methods
Singleton methods of SomeClass
test
Singleton methods of test_obj
test_2
test_3
참고URL : https://stackoverflow.com/questions/21122691/attr-accessor-on-class-variables
'program tip' 카테고리의 다른 글
android.database.sqlite.SQLiteCantOpenDatabaseException : 알 수없는 오류 (코드 14) : 데이터베이스를 열 수 없습니다. (0) | 2020.12.08 |
---|---|
Angular ui-router-상위 템플릿에서 전달 된 중첩 된 명명 된 뷰의 매개 변수에 액세스하는 방법은 무엇입니까? (0) | 2020.12.08 |
이 Android SDK에는 Android Developer Toolkit 버전 23.0.0 이상이 필요합니다. (0) | 2020.12.08 |
AngularJS-ng-disabled가 앵커 태그에 대해 작동하지 않음 (0) | 2020.12.08 |
로그인 화면으로 반응 탐색 (0) | 2020.12.08 |