to_unsafe

어떤 타입이 to_unsafe 메서드를 정의한다면, C에 값을 넘길 때 이 메서드가 반환하는 값이 전달됩니다.

lib C
  fun exit(status : Int32) : NoReturn
end

class IntWrapper
  def initialize(@value)
  end

  def to_unsafe
    @value
  end
end

wrapper = IntWrapper.new(1)
C.exit(wrapper) # wrapper는 Int32가 아니지만 to_unsafe 메서드는
                # 맞기 때문에 wrapper.to_unsafe가 대신 전달됨

이는 값을 명시적으로 변환하지 않으면서도 C 타입의 래퍼를 정의할 때 아주 유용합니다.

예를 들어 String 클래스는 UInt8*를 반환하는 to_unsafe를 구현하고 있습니다.

lib C
  fun printf(format : UInt8*, ...) : Int32
end

a = 1
b = 2
C.printf "%d + %d = %d\n", a, b, a + b

results matching ""

    No results matching ""