Rubype를 사용하여 Ruby에서 유형의 이점을 즐길 수 있습니다.
12330 단어 Rails금형프로그래밍루비programming
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.typesig
Method#type_info
Method#arg_types
Method#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가 정의하는 추가 클래스로는
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
class People
def marry(people)
# 何を返値にしても大丈夫です!
end
typesig :marry, [People] => Any
end
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.typesig
Method#type_info
Method#arg_types
Method#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가 정의하는 추가 클래스로는
class MyClass
def typed_method(arg)
1
end
typesig :typed_method, [String] => Fixnum
end
형식 정보를 해시로 반환
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가 정의하는 추가 클래스로는
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]
반환 값의 형식 정보를 반환합니다.
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
클래스 Boolean
클래스 오류는
module Rubype
class ArgumentTypeError < ::TypeError; end
class ReturnTypeError < ::TypeError; end
end
두
아직 시작했기 때문에
함께 해주는 사람을 강간 모집하고 있습니다!
다들 와이와와 하자~!
Reference
이 문제에 관하여(Rubype를 사용하여 Ruby에서 유형의 이점을 즐길 수 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/gogotanaka/items/c07e1ea6b88054a7c809
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Rubype를 사용하여 Ruby에서 유형의 이점을 즐길 수 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gogotanaka/items/c07e1ea6b88054a7c809텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)