programing

class << 루비의 자기 관용어

goodjava 2023. 6. 4. 18:44

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에서는 클래스에 적용할 수 있는 세 가지 방법이 있습니다.

  1. 인스턴스 메서드
  2. 싱글턴 방법
  3. 클래스 메소드

인스턴스 메소드와 클래스 메소드는 다른 프로그래밍 언어의 동음이와 거의 비슷합니다.

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.
는 우가준것은리것을 주었습니다.hisingleton 클래스 인스턴스 메서드: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