attr_accessor의 물건을 재발명하다

5785 단어 Rubytech

의 목적

attr_accessor 같은 방법은 어떻게 생긴 건가요?
이런 의문에서 attr_accessor_alias라는 액세서리 방법을 만들어 봤다.

Module과 Class의 관계


Class.superclass
=> Module
모듈은 Class 레벨의 슈퍼클래스입니다.
따라서 모델 클래스 실례 방법Module#hoge으로 정의된Class.new.hoge은Class 클래스 실례 방법으로 사용할 수 있다.
따라서 대상의 방법을 모델 클래스의 실례적인 방법으로 정의하면 된다.(Class 클래스의 인스턴스로 사용할 수도 있음)

생성 방법


class Module
  def attr_accessor_alias(*attrs)
    attrs.each do |attr|
      define_method attr do
        instance_variable_get("@#{attr}")
      end

      define_method "#{attr}=" do |val|
        instance_variable_set("@#{attr}", val)
      end
    end
  end
end

적당한 반을 세우다


class MyClass
  # MyClassはModuleクラスを継承したClassクラスのインスタンスであるので
  # attr_accessor_aliasを呼び出し可能
  attr_accessor_alias :hoge, :fuga
end
[6] pry(main)> c = MyClass.new
=> #<MyClass:0x00007fd7418ae3d0>
[7] pry(main)> c.hoge
=> nil
[8] pry(main)> c.hoge = 30
=> 30
[9] pry(main)> c.fuga = 22
=> 22
[10] pry(main)> c
=> #<MyClass:0x00007fd7418ae3d0 @fuga=22, @hoge=30>
[11] pry(main)> 
의 진전이 순조롭다.기쁘고 축하할 만하다.

참고 자료

  • 위안 전문가 루비
  • 좋은 웹페이지 즐겨찾기