class << 루비의 자기 관용어
가 입니까?class << self루비에서?
저먼.class << foo하면 열다구니립이 열립니다.foo의 싱글톤 클래스(클래식 클래스).이를 통해 특정 개체에 대해 호출되는 메서드의 동작을 지정할 수 있습니다.
a = 'foo'
class << a
def inspect
'"bar"'
end
end
a.inspect # => "bar"
a = 'foo' # new object, new singleton class
a.inspect # => "foo"
: 이제질답니다습겠하에문다▁now니습답하겠▁answer:.class << self을 열다self 의톤클래에 할 수 현재에 대해 메서드를 재정의할 수 있습니다.self개체(클래스 또는 모듈 본체 내부에 있는 클래스 또는 모듈 자체)입니다.일반적으로 클래스/모듈("정적") 메서드를 정의하는 데 사용됩니다.
class String
class << self
def value_of obj
obj.to_s
end
end
end
String.value_of 42 # => "42"
이것은 속기로도 쓸 수 있습니다.
class String
def self.value_of obj
obj.to_s
end
end
또는 더 짧습니다.
def String.value_of obj
obj.to_s
end
때, 함수정안있을때에의,때,self함수가 호출되는 개체를 나타냅니다. 이경에는우,,class << self해당 개체에 대한 싱글톤 클래스를 엽니다. 이 클래스의 한 가지 용도는 가난한 사람의 상태 기계를 구현하는 것입니다.
class StateMachineExample
def process obj
process_hook obj
end
private
def process_state_1 obj
# ...
class << self
alias process_hook process_state_2
end
end
def process_state_2 obj
# ...
class << self
alias process_hook process_state_1
end
end
# Set up initial state
alias process_hook process_state_1
end
따라서 위의 예에서 각 인스턴스는StateMachineExample가지다process_hook에독된에 process_state_1하지만 후자에서는 어떻게 다시 정의할 수 있는지 주목하세요.process_hook(의 경우)self단지, 다른 사람에게 영향을 미치지 않는StateMachineExample에서 예)까지process_state_2그래서, 발신자가 전화를 할 때마다process 정의할 수 있는 ▁the다▁()▁calls(▁method함호출방법▁rewhichdefin)를 호출하는 방법process_hook.), 상에따동변작경됩니다이라태▁),다니변됩경▁the▁changes▁depending.
저는 매우 간단한 설명을 찾았습니다.class << self,Eigenclass다양한 유형의 방법을 사용할 수 있습니다.
Ruby에서는 클래스에 적용할 수 있는 세 가지 방법이 있습니다.
- 인스턴스 메서드
- 싱글턴 방법
- 클래스 메소드
인스턴스 메소드와 클래스 메소드는 다른 프로그래밍 언어의 동음이와 거의 비슷합니다.
class Foo
def an_instance_method
puts "I am an instance method"
end
def self.a_class_method
puts "I am a class method"
end
end
foo = Foo.new
def foo.a_singleton_method
puts "I am a singletone method"
end
에 액세스하는 Eigenclass메소드를 는과 같은 구문으)ㄹ 수 있음)을 합니다.class <<):
foo = Foo.new
class << foo
def a_singleton_method
puts "I am a singleton method"
end
end
이제 당신은 싱글톤 방법을 정의할 수 있습니다.self 수업이 ?Foo그 자체는 다음과 같은 맥락에서:
class Foo
class << self
def a_singleton_and_class_method
puts "I am a singleton method for self and a class method for Foo"
end
end
end
일반적으로 인스턴스 메소드는 전역 메소드입니다.즉, 해당 클래스가 정의된 클래스의 모든 인스턴스에서 사용할 수 있습니다.반대로 싱글톤 방법은 단일 객체에 구현됩니다.
Ruby는 메서드를 클래스에 저장하며 모든 메서드는 클래스와 연결되어야 합니다.싱글톤 메서드가 정의된 개체는 클래스가 아닙니다(클래스의 인스턴스).클래스만 메서드를 저장할 수 있는 경우 개체가 싱글톤 메서드를 어떻게 저장할 수 있습니까?싱글톤 메서드가 생성되면 Ruby는 해당 메서드를 저장할 익명 클래스를 자동으로 생성합니다.이러한 익명 클래스를 메타 클래스라고 하며, 싱글톤 클래스 또는 고유 클래스라고도 합니다.싱글톤 방법은 메타 클래스와 연결되며, 이는 싱글톤 방법이 정의된 개체와 연결됩니다.
단일 개체 내에 여러 개의 싱글톤 메서드가 정의된 경우에는 모두 동일한 메타클래스에 저장됩니다.
class Zen
end
z1 = Zen.new
z2 = Zen.new
class << z1
def say_hello
puts "Hello!"
end
end
z1.say_hello # Output: Hello!
z2.say_hello # Output: NoMethodError: undefined method `say_hello'…
예에서, 위의예에서,,class << z1현재 자체를 z1 개체의 메타 클래스를 가리키도록 변경한 다음 메타 클래스 내에서 say_hello 메서드를 정의합니다.
클래스는 개체(클래스라고 하는 기본 제공 클래스의 인스턴스)이기도 합니다.클래스 메소드는 클래스 개체와 연결된 싱글톤 메소드에 불과합니다.
class Zabuton
class << self
def stuff
puts "Stuffing zabuton…"
end
end
end
모든 개체에 메타 클래스가 있을 수 있습니다.이것은 수업에도 메타 수업이 있을 수 있다는 것을 의미합니다.위의 예에서 클래스 << self는 self를 수정하여 Zabuton 클래스의 메타 클래스를 가리킵니다.명시적 수신기(메소드가 정의될 클래스/객체) 없이 메소드를 정의할 때, 그것은 현재 범위, 즉 현재 자신의 값 내에서 암시적으로 정의됩니다.따라서, 스터프 방법은 Zabuton 클래스의 메타 클래스 내에서 정의됩니다.위의 예는 클래스 메소드를 정의하는 또 다른 방법입니다.IMHO, def self.my _new_clas_methods 구문을 사용하여 클래스 메소드를 정의하는 것이 좋습니다. 코드를 이해하기 쉽기 때문입니다.위의 예제가 포함되어 클래스 << self 구문을 발견했을 때 어떤 일이 발생하는지 이해할 수 있습니다.
루비 클래스에 대한 추가 정보는 이 게시물에서 확인할 수 있습니다.
클래스 << 사물이 하는 일:
class Hi
self #=> Hi
class << self #same as 'class << Hi'
self #=> #<Class:Hi>
self == Hi.singleton_class #=> true
end
end
[그것이 만드는 self == thing.singleton_class 그 블록의 맥락에서].
singleton_class가 무엇입니까?
hi = String.new
def hi.a
end
hi.class.instance_methods.include? :a #=> false
hi.singleton_class.instance_methods.include? :a #=> true
hi개체가 해당 개체를 나타냅니다.#methods에서.#singleton_class.instance_methods그리고 나서 그것으로부터.#class.instance_methods.
는 우가준것은리것을 주었습니다.hi의 singleton 클래스 인스턴스 메서드:a대신에 class << hi>로 할 수도 있어요.
hi의#singleton_class에는 모든 메서드가 .hi의#class가지고 있고, 아마도 더 있을 것입니다.:a
[일을 하는 데 필요한 방법들] #class 그리고. #singleton_class 사물에 직접 적용할 수 있습니다.루비가 thing.a를 볼 때, 그것은 먼저 :thing.singleton_class.sys_method_definition을 찾은 다음 thing.class.sys_method]를 찾습니다.
그런데 - 그들은 객체의 싱글톤 클래스 == 메타 클래스 == 고유 클래스라고 부릅니다.
Δ 싱글턴 방법은 단일 개체에 대해서만 정의되는 방법입니다.
예:
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's methods of SomeClass"
puts SomeClass.singleton_methods
puts '------------------------------------------'
puts "Singleton's methods of test_obj"
puts test_obj.singleton_methods
싱글턴의 Some Class 방법
시험
싱글턴의 test_obj 방법
test_2
test_3
실제로 루비 프로젝트에 C 확장자를 작성하는 경우 모듈 메서드를 정의하는 방법은 단 한 가지뿐입니다.
rb_define_singleton_method
이 셀프 비즈니스는 다른 모든 종류의 질문을 열어 각 부분을 검색하면 더 잘할 수 있다는 것을 알고 있습니다.
물체 먼저.
foo = Object.new
제가 foo 방법을 만들 수 있을까요?
그럼요.
def foo.hello
'hello'
end
어떻게 해야 하나요?
foo.hello
==>"hello"
그냥 다른 물건.
foo.methods
모든 Object 메서드와 새 메서드를 모두 사용할 수 있습니다.
def foo.self
self
end
foo.self
그냥 foo Object.
클래스 및 모듈과 같은 다른 개체에서 foo를 만들면 어떻게 되는지 확인합니다.모든 답변의 예는 사용하기 좋지만 코드가 작성되는 방식에 어떤 일이 일어나고 있는지 이해하기 위해서는 다양한 아이디어나 개념을 사용해야 합니다.이제 여러분은 많은 용어들을 살펴봐야 합니다.
Singleton, Class, Module, self, Object 및 Eigen 클래스가 시작되었지만 Ruby는 Object Model을 그런 식으로 명명하지 않습니다.메타클래스에 가깝습니다.Richard 또는 __why가 여기서 아이디어를 보여줍니다.http://viewsourcecode.org/why/hacking/seeingMetaclassesClearly.html 그리고 만약 그것이 당신을 놀라게 한다면, 검색에서 루비 객체 모델을 찾아보세요.제가 유튜브에서 알고 있는 두 개의 비디오는 데이브 토마스와 피터 쿠퍼입니다.그들은 또한 그 개념을 설명하려고 노력합니다.데이브가 받는 데 시간이 오래 걸렸으니 걱정하지 마세요.저도 아직 작업 중입니다.그렇지 않으면 내가 왜 여기에 있겠어요?질문 감사합니다.또한 표준 라이브러리를 살펴봅니다.FYI와 마찬가지로 싱글톤 모듈이 있습니다.
이것은 꽤 좋습니다.https://www.youtube.com/watch?v=i4uiyWA8eFk
언급URL : https://stackoverflow.com/questions/2505067/class-self-idiom-in-ruby
'programing' 카테고리의 다른 글
| 글로벌 스코프가 아닌 외부(포함) 범위에 있는 파이썬에서 변수를 수정할 수 있습니까? (0) | 2023.06.04 |
|---|---|
| Attach로 연 SQLite 데이터베이스 파일의 테이블을 나열하려면 어떻게 해야 합니까? (0) | 2023.06.04 |
| Android 에뮬레이터 디스플레이를 회전하려면 어떻게 해야 합니까? (0) | 2023.06.04 |
| 속성 값을 기준으로 Float(Dart)의 개체 목록 정렬 (0) | 2023.06.04 |
| 문자열이 기본 유형입니까? (0) | 2023.06.04 |