Rubype를 사용하여 Ruby에서 유형의 이점을 즐길 수 있습니다.

Ruby + Type = Rubype



기존 코드와의 호환성을 잃지 않고 선택적으로 메서드에 형식 보증을주는 Gem입니다.



Github
HP
HackerNews

여기서 가리키는 '메서드 유형 보증'은 런타임 수준에서 메소드의 인수 반환 값의 클래스 유형과 응답해야하는 메소드를 보장하는 것입니다.

얻은 일반적인 유형 보증의 이점



Executable 문서를 코드에 부여 할 수 있습니다.
오류가 더 의미있는 오류가됩니다.
Rubype가 확실하다면 인수 반환 값 검사를 처리 할 필요가 없습니다.

이러한 방식으로 유형 정보를 부여해야합니다.



런타임에 동적으로 유형 부여 변경 및 유형 정보를 확인할 수 있습니다 (유형 정보도 오브젝트).
클래스형 뿐만이 아니라, 반응해야 할 메소드를 심볼로 지정하는 것이 가능

이 젬의 단점, 끝없는 곳



이 메서드를 호출 할 때마다 형식 검사를 수행하여 오버 헤드가 생성됩니다.
(그러나 많은 경우에는 걱정할 정도는 아닙니다)

실행 전에 수행되는 소위 유형 검사로 인한 이점은 누릴 수 없습니다.

선택적으로 메서드의 인수와 반환값의 클래스를 보증



유형 보증을 제공하지 않는 메소드와 공존 할 수 있으므로 점진적으로 유형 정보를 부여 할 수 있습니다.
require 'rubype'

class MyClass
  # `sum`が2つの`Numeric`オブジェクトを取り、`String`オブジェクトを返す事を保証する
  def sum(x, y)
    (x + y).to_s
  end
  typesig :sum, [Numeric, Numeric] => String
end

MyClass.new.method(:sum).type_info
#=> [Numeric, Numeric] => String

MyClass.new.new(1, 2)
#=> '3'

# 
MyClass.new.sum(1, '2')
#=> Rubype::ArgumentTypeError: Expected MyClass#sum's 2nd argument to be Numeric but got "2" instead

Any형이나 심볼을 사용하면 오리 타입도 가능


class People
  def marry(people)
    # 何を返値にしても大丈夫です!
  end
  typesig :marry, [People] => Any
end

#to_i에 반드시 반응하는 것을 보증


class MyClass
  def sum(x, y)
    x.to_i + y
  end
  typesig :sum, [:to_i, Numeric] => Numeric
end

MyClass.new.sum(:has_no_to_i, 2)
#=> Rubype::ArgumentTypeError: Expected MyClass#sum's 1th argument to have method #to_i but got :has_no_to_i instead

명쾌!


class People
  def marry?(people)
    'not boolean'
  end
  typesig :marry?, [People] => Boolean
end

People.new.marry?(People.new)
#=> Rubype::ReturnTypeError: Expected People#marry? to return Boolean but got "not boolean" instead

유형 정보도 오브젝트이므로 동적으로 부여 변경을 확인할 수 있습니다.



동적 유형 부여 또는 변경의 의미는 확실하지 않지만 실행 중에 유형 정보를 확인할 수 있다는 장점이라고 생각합니다.
require 'rubype'

class MyClass
  def string?(x)
    x.is_a?(String)
  end
  typesig :string?, [Any] => Boolean
end

typed_method = MyClass.new.method(:string?)

if typed_method.return_type == Boolean
  # メソッドの型情報をコードに組み込む事ができる.
  ...
end

문서



Gem의 사용자가 사용한다고 상정되는 메소드를 이하의 4개
Module.typesigMethod#type_infoMethod#arg_typesMethod#return_type

Module.typesig



유형 정보를 부여하십시오.typesig(メソッド名, 型情報)
class MyClass
  def typed_method(arg)
    1
  end
  typesig :typed_method, [String] => Fixnum
end
型情報 의 일반형은
[(第一引数の型), (第二引数の型) ... (第n引数の型)] => (返値の型)
로 주어진다.

이 컨텍스트에서 는 객체 클래스 또는 반응해야하는 메서드 중 하나입니다.

동일한 메소드에 대해 typesig가 두 번 이상 정의되면 나중에 정의 된 메소드 만 처리하십시오.

Method#type_info



형식 정보를 해시로 반환
class MyClass
  def typed_method(arg)
    arg.to_i
  end
  typesig :typed_method, [:to_i] => Fixnum
end

MyClass.new.method(:typed_method).type_info
#=> {[:to_i]=>Fixnum}

Method#arg_types



인수의 형태 정보를 배열로 돌려줍니다.
class MyClass
  def typed_method(arg)
    arg.to_i
  end
  typesig :typed_method, [:to_i] => Fixnum
end

MyClass.new.method(:typed_method).arg_types
#=> [:to_i]

Method#return_type



반환 값의 형식 정보를 반환합니다.
class MyClass
  def typed_method(arg)
    arg.to_i
  end
  typesig :typed_method, [:to_i] => Fixnum
end

MyClass.new.method(:typed_method).return_type
#=> Fixnum

Rubype가 정의하는 추가 클래스로는
  • 어떤 오브젝트에 대해서도 형태 정보로서 매치 Any 클래스
  • TrueClass 및 FalseClass 개체에 형식 정보로 일치 Boolean 클래스

  • 오류는
    module Rubype
      class ArgumentTypeError < ::TypeError; end
      class ReturnTypeError   < ::TypeError; end
    end
    



    아직 시작했기 때문에



    함께 해주는 사람을 강간 모집하고 있습니다!

    다들 와이와와 하자~!

    좋은 웹페이지 즐겨찾기