내가 Ruby 클래스에 대해 몰랐던 것

4806 단어 rubyrailswebdev
나는 그것들을 배우기 위해 무언가를 쓰곤 하므로 여기에 내가 몰랐던 것에 대한 일련의 짧은 기사가 있습니다.

클래스 클래스



Class 클래스는 Module에서 직접 상속되며 인스턴스와 관련된 모든 동작을 모듈에 추가합니다. 간단히 말해서 모듈은 앱의 하나 또는 여러 클래스에 메서드를 추가하는 데 사용되며 클래스는 개체의 속성을 관리하는 데 사용됩니다.


추신: 이 다이어그램은 매우 미니멀하고 클래스에 초점을 맞추고 있지만 모듈과 개체에는 다른 자식이 많이 있습니다.

클래스 및 조상



클래스의 조상을 보려면 .superclass 메소드를 사용할 수 있습니다.

>> Class.superclass
=> Module

>> Module.superclass
=> Object


그리고 특정 클래스의 모든 슈퍼클래스를 보려면 .ancestors 메소드를 사용할 수 있습니다.

>> Class.ancestors
=> [Class, Module, Object, Kernel, BasicObject]


여기서 배열은 클래스의 모든 슈퍼클래스를 포함하며 이것이 우리가 루비에서 조상 체인이라고 부르는 것입니다.

클래스는 상수입니다.



Ruby에서 새 클래스를 정의하면 실제로 Class 클래스의 인스턴스가 생성됩니다.

class Foo
end

>> Foo.class
=> Class


예를 들어 여기에서 Foo라는 새 클래스를 만들었습니다. 이 클래스는 Class 클래스의 인스턴스이며 상수 Foo를 사용하여 이 인스턴스에 액세스할 수 있습니다.
이 논리에 따라 Foo를 일반 객체처럼 만들 수 있음을 알 수 있습니다.

Foo = Class.new

>> Foo.class
=> Class


루비는 메소드를 어떻게 찾나요?




class MyExample   
 def say_hello
   puts 'hello world'
 end
end

>> MyExample.ancestors
=> [MyExample, Object, Kernel, BasicObject]

>> MyExample.new.say_hello
=> hello world

>> MyExample.new.say_good_bye
=> NoMethodError


say_hello : MyExample 클래스의 인스턴스에서 say_hello 메서드를 호출하면 Ruby는 MyExample 클래스에서 say_hello라는 메서드를 찾고 이를 찾아 적절한 결과를 반환합니다.

say_good_bye : 내가 say_good_bye 메서드를 호출하면 ruby는 이 메서드에 대해 MyExample을 조사할 것입니다. 이 메서드를 찾지 못한 다음 BasicObject가 호출될 때까지 한 번에 각 부모를 통과하는 조상 체인을 거쳐 say_good_bye라는 메서드를 찾습니다.

say_good_bye 메서드가 MyExample 클래스나 조상 클래스에 없기 때문에 Ruby는 NoMethodError를 반환합니다.

클래스 포함 및 확장



모듈의 코드를 클래스에 추가하는 것은 include, extend 및 prepend 메소드를 사용하여 수행할 수 있습니다. 첫 번째 두 가지가 훨씬 더 일반적이므로 초점을 맞추겠습니다.

포함



As the doc says 클래스에 모듈이 포함되어 있으면 모듈의 인스턴스 메서드를 클래스의 인스턴스 메서드로 사용할 수 있습니다.

module RandomModule
  def say_thank_you
    puts 'thank you'  
  end
end

class RandomClass   
 include RandomModule
end

>> RandomClass.new.say_thank_you
=> thank you

>> RandomClass.ancestors
=> [RandomClass, RandomModule, Object, Kernel, BasicObject]


여기에서 RandomClass의 조상 체인을 확인하면 RandomModule이 나타납니다!

앞에서 보았듯이 모듈의 메소드(say_thank_you)를 호출하면 Ruby는 RandomClass 클래스에서 메소드를 확인하고 찾을 수 없으므로 Ruby는 메소드를 찾기 위해 RandomClass 클래스의 각 조상을 살펴봅니다. .

연장하다



나는 항상 extend와 include의 차이점이 모호하다는 것을 발견했지만 실제로는 매우 다릅니다. extend는 모듈의 메서드를 인스턴스 메서드가 아닌 클래스 메서드로 추가합니다.

module RandomModule
  def say_thank_you
    puts 'thank you'  
  end
end

class RandomClass   
 extend RandomModule
end

>> RandomClass.new.say_thank_you
=> NoMethodError

>> RandomClass.say_thank_you
=> thank you

>> RandomClass.ancestors
=> [RandomClass, Object, Kernel, BasicObject]


보시다시피 모듈은 RandomClass와 혼합되어 있으며 인스턴스 수준(RandomClass.new.method)이 아닌 클래스 수준(RandomClass.method)에서 해당 메서드에 액세스할 수 있습니다.

하나의 특정 인스턴스에서 extend 를 사용할 수도 있습니다.

module RandomModule
  def say_thank_you
    puts 'thank you'  
  end
end

class RandomClass
end

>> RandomClass.new.say_thank_you
=> NoMethodError

>> new_instance = RandomClass.new
>> new_instance.extend RandomModule
>> new_instance.say_thank_you
=> thank you


수업이 열려 있습니다



이는 특정 조상 클래스의 메소드를 항상 추가하고 편집할 수 있음을 의미합니다. 직접 만든 클래스에 대해 또는 Ruby의 일부인 클래스에서 이를 수행할 수 있습니다.

class String
  def tell_my_size
    self.size
  end

  def reverse
    self.size
  end
end

>> my_string = 'hello world'
>> my_string.tell_my_size
=> 11

>> my_string.reverse
=> 11


String 클래스에 새 메서드를 추가하고 역방향 메서드의 동작을 변경했습니다.
물론 이런 식으로 다른 클래스를 재정의하는 것은 위험합니다! 그렇게 함에 있어 매우 주의하고 항상 기존 클래스를 직접 편집하는 것을 선호합니다.

마지막 단어



클래스에 대한 다른 많은 개념이 있다는 것을 알고 있지만 이 기사의 전부입니다. 의견에서 설명을 개선할 수 있습니다. 향후 여기에 더 많은 개념을 추가할 수 있습니다. 👋

좋은 웹페이지 즐겨찾기