Ruby 3.0 가져오기 유형 정의!Typeprof로 Block 및 Proc 분석
입문
Ruby3.0은 코드에 대해 유형 정의RBS를 제공합니다.루비에서 실행되는 제품의 가독성과 유지보수성을 높이기 위해 이런 유형의 정의를 도입하는 것을 고려하는 사람들이 많다.
RBS는 정적 해석을 바탕으로 하는 유형 분석 도구Typeprof로 루비 코드에 유형 정보를 제공할 수 있습니다.RBS와 Typeprof의 기본 해설은 다양한 보도가 있기 때문에 본 보도는 문서에 잘 실리지 않는 Typeprof의 Block과 Proc의 유형 추리를 총결하였다.
사용 환경은 다음과 같습니다.
ruby 3.0.0preview1 (2020-09-25 master 0096d2b895) [x86_64-darwin18]
typeprof (0.9.0)
steep (0.37.0)
rbs (0.20.1)
준비
Proc의 간단한 코드를 사용하려고 합니다.
# lib/app.rb
class App
def foo(n)
n.to_s
end
def boo(fn)
fn.call
end
def baz(fn)
fn.call(5)
end
def bar(&fn)
fn.call(0)
end
end
proc1 = proc { "ブロック" }
proc2 = Proc.new { |n| n.to_s }
app = App.new
p app.foo(5)
p app.boo(proc1)
p app.baz(proc2)
p app.bar { |a| a.to_s }
제가 먼저 운행하겠습니다.
$ ruby lib/app.rb
"5"
"ブロック"
"5"
"0"
순조롭게 집행되었다.그럼 typeprof로 금형 해석을 하겠습니다.
$ typeprof lib/app.rb
# Revealed types
# lib/app.rb:24 #=> String
# lib/app.rb:25 #=> String
# lib/app.rb:26 #=> untyped
# lib/app.rb:27 #=> String
# Classes
class App
def foo: (Integer) -> String
def boo: (^-> String) -> String
def baz: (Proc) -> untyped
def bar: { (Integer) -> String } -> String
end
형 해석 결과가 나왔습니다.실행 코드를 통해 대체적인 유형을 판단하고 처음부터 RBS를 쓰는 시간을 절약할 수 있어서 정말 감사합니다.유형 prof 문서에 따르면 Proc는 추상화되지 않고 기본적으로 전달된 매개 변수와 되돌아오는 값에 따라 구체적인 유형을 출력한다.Proc 객체는 λ 표현식(->)블록 임시 매개 변수 (&blk) 로 만든 폐쇄입니다.그것들은 추상화되지 않고 코드 필름과 결합된 구체적인 값으로 여겨진다.이러한 매개변수 또는 반환된 값을 전달하여 RBS를 내보냅니다.
Typeproc는 실행 코드를 통해 유형 정보를 해석하기 때문에 어떤 분석 결과가 나올지는 코드의 사용례에 따라 다르다.이번 코드에서 boo는 인자 없이 String의proc(^->String)->String으로 분석되었습니다. 예를 들어 int의proc로 변경하면 typeprof의 분석 결과가 변경됩니다.
proc1 = proc { 1 }
p app.boo(proc1)
#=> def boo: (^-> Integer) -> Integer
이 두 가지를 주면 출입력 쌍방이 연합형 서명이 된다.proc1 = proc { "ブロック" }
proc2 = proc { 1 }
p app.boo(proc1)
p app.boo(proc2)
#=> def boo: (^-> (Integer | String)) -> (Integer | String)
Proc와 block의 형식 서명은 다음과 같습니다.자세한 내용은 RBS의 syntax 문서 을 참조하십시오.
# Proc
^(Integer) -> String
^(?String, size: Integer) -> bool
#Block
{ (Integer) -> (Integer | String) }
boo는 입력과 출력의 유형에 대한 분석을 잘 할 수 있지만 baz는 입력이 Proc라는 것만 분석할 수 있다.나는 문서를 찾아보니 다음과 같은 문장을 발견했다.Class.new는 지원되지 않습니다.
직접적인 원인인지는 검증할 수 없지만 상술한baz의proc2도proc 함수로 작성합니다.
proc2 = proc { |n| n.to_s }
p app.baz(proc2)
# => def baz: (^(Integer) -> String) -> String
이번에는 금형을 잘 분석했다.그럼 이 결과를 바로 RBS 파일로 만들어.RBS 파일의 확장자는 입니다.rbs입니다.
# sig/app.rbs
class App
def foo: (Integer) -> String
def boo: (^-> String) -> String
def baz: (Proc) -> untyped
def bar: { (Integer) -> String } -> String
end
그러면 이 유형 정보를 바탕으로 실행 파일의 유형 정보를 검사합니다.형식 서명을 사용하는 정적 검사는gemsteep를 사용합니다.다음 명령을 사용하여 steep에 프로필을 만듭니다.$ steep init
다음과 같이 생성된 Steepfile을 수정합니다.signature에서 RBS의 형식 서명 파일이 있는 디렉터리를 지정하고, check에서 검사할 rb 파일의 디렉터리를 지정합니다.
target :lib do
signature "sig"
check "lib"
end
정적 검사 유형 정보.$ steep check
lib/app.rb:25:10: ArgumentTypeMismatch: receiver=::App, expected=^() -> ::String, actual=::Proc (proc1)
lib/app.rb:26:10: ArgumentTypeMismatch: receiver=::App, expected=^(::Integer) -> ::String, actual=::Proc (proc2)
몰드를 검사하는 동안 오류가 발생했습니다.steep는 Proc의 매개 변수를 검사할 수 없는 것 같습니다. Proc와 줄거리형 서명을 일치하지 않는 것으로 보고 오류를 토해내기 때문에 다음과 같이 고쳐야 합니다.
# sig/app.rbs
class App
def foo: (Integer) -> String
def boo: (Proc) -> String #<=ここを編集
def baz: (Proc) -> String #<=ここを編集
def bar: { (Integer) -> String } -> String
end
몰드 검사를 다시 진행합니다.$ steep check
이번에는 실수가 없었다.steep에서proc 매개 변수의 형식을 검사할 수 있었으면 좋겠어요.최종 폴더 구성은 다음과 같습니다.또 사용된 코드가 https://github.com/TomeHirata/typeprof_test로 상승했다.
총결산
Ruby 3.0의 표준 RBS와 Typeprof를 사용하여 루비 코드의 유형 분석을 진행했습니다.기존 루비 코드에서 자동으로 RBS의 유형 정의를 분석하는 Typeprof는 매우 편리해 보입니다!Typeprof에서 대체적인 유형 정의를 자동으로 생성하고 일부 수정함으로써 유형 정의를 간단하게 준비할 수 있습니다.
RBS에서 Proc와 Block은 각각 다음과 같지만 본 기사를 집필할 때 Typeprof에서 Class입니다.new가 없습니다. steep에서 프로토콜의 형식이 일치하지 않는 오류가 발생했습니다.
# Proc
^(Integer) -> String
#Block
{ (Integer) -> (Integer | String) }
또 형 서명의 작법과 해석 도구의 추리 부분 등 이해하기 어려운 부분이 있지만 앞으로 개선될 것이다.여러분도 이 기회에 꼭 스타일리시한 루비 생활을 시작해야 합니다.그리고 만약 Tips가 이렇게 썼다면 steep과 Typeprof에서 Proc의 정의가 좋을 거라면 꼭 알려주세요!!마지막
현재 에스티, 자바스크립트와 루비를 적극 채용한 엔지니어 중!!
부동산 데이터로 데이터 플랫폼을 구축하고 분석하고 제품을 만드는 사람이 어쨌든!
기타 블로그 및 모집 페이지 을 참조하십시오.
Reference
이 문제에 관하여(Ruby 3.0 가져오기 유형 정의!Typeprof로 Block 및 Proc 분석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TomeHirata/items/3cd04cac7b058c149b1f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)