Translate

2018년 7월 21일 토요일

메타프로그래밍

2011년 3월 20일 일요일

enum 형을 만들었다.
메소드 included, const_missing 을 눈여겨볼 것.

module EnumType
    @@enums = {}

    def initialize const, value
        @const = const
        @value = value
    end

    def to_i
        @value
    end

    def to_s
        "#{self.class}::#{@const}"
    end

    def self.included base
        class << base
            def const_missing const
                @@enums.include?(const) ? @@enums[const] : raise(const.to_s)
            end

            def [](value)
                @@enums[value]
            end

            def enum array
                array.each_with_index do |const, value|
                    @@enums[const] = new(const, value)
                    @@enums[value] = @@enums[const]
                end
            end
        end

        base.private_class_method :new
    end
end

class GIRepositoryError
    include EnumType

    enum [:G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND,
          :G_IREPOSITORY_ERROR_NAMESPACE_MISMATCH,
          :G_IREPOSITORY_ERROR_NAMESPACE_VERSION_CONFLICT,
          :G_IREPOSITORY_ERROR_LIBRARY_NOT_FOUND
    ]
end

p GIRepositoryError[1].object_id
p GIRepositoryError[:G_IREPOSITORY_ERROR_NAMESPACE_MISMATCH].object_id
p GIRepositoryError::G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND.class
p GIRepositoryError::G_IREPOSITORY_ERROR_TYPELIB_NOT_FOUND
p GIRepositoryError::G_IREPOSITORY_ERROR_NAMESPACE_MISMATCH.object_id
p GIRepositoryError::G_IREPOSITORY_ERROR_NAMESPACE_MISMATCH


A Sponsored Dragon-Slaying


http://mislav.uniqpath.com/poignant-guide/book/chapter-6.html#section3

Metaprogramming in Ruby


http://ruby-metaprogramming.rubylearning.com/

댓글 없음:

댓글 쓰기

응용 어플 끝글자 버그 잡는 거 진짜 개쉽습니다

그 동안 제가 끝글자 버그를 잡지 않고 방치한 이유 우선 책임, 의무가 없습니다. 제가 해당 어플 개발자도 아닐 뿐더러 오픈소스가 원래가 유지보수 의무, 보증 책임이 없습니다 . 이렇게 개떡 같은 게 오픈소스입니다. 전 과거 libhwp 하냐고...