pipeline operator가 사용하는 인코딩을 읽고 발견했습니다!

13576 단어 Ruby2.7Ruby

개시하다


2019/6/13, 루비 2.7에는 piperline operator가 추가됐다.
디스커션 분위기가 고조되면서 TL 각 루비이스트들의 다양한 의견도 날아다녔다.
그중에 @hanachin_씨의 트위터를 봤어요.
여러 번 봤어요 "https://t.co/8sUOXpGLwt"itself |>>> URI.:parse |>>> Net::HTTP.:get |>>> JSON.:parse |> call |> fetch("stargazers_count") |> then { puts @1 }— Miyagi (@hanachin_) 2019년 6월 14일

Ruby 2.7에 추가된 기능이 적극적으로 사용되고 있어 많은 것을 배울 수 있을 것 같아서 총괄해 봤습니다.br/>
잘못된 인식이나 부족한 점이 있을 수 있으니 그때 알려주세요br/>
첫 큐타 기사니까 봐주세요.


루비 버전


2.7.0-dev


※ 2019/6/4시 현재 2.7 개발 중, 2.7시 새롭게 추가된 기능 행위는 향후 이 기사와 다를 수 있습니다p>

정편


이 전선은 무엇을 하는 것입니까?


우선@hanachin_의 코드와 아래의 코드는 동일합니다.


puts JSON.parse(Net::HTTP.get(URI.parse("https://api.github.com/repos/ruby/ruby"))).fetch("stargazers_count")

URL에서 GET가 JSON을 요청하여 가져오기stargazers_count 및 내보내기p>

이 코드를 읽는 데 필요한 지식


기존 기능


  • Object#itself
  • Method#>>
  • Object#then

2.7 새로운 기능


  • .:
  • pipeline operator
  • Numbered parameters

첫줄


"https://api.github.com/repos/ruby/ruby".:itself

Object#itself


self, 수신기 자체로 되돌아오기br/>
여기는"https://api.github.com/repos/ruby/ruby"입니다.


참조: Object#itself


.:fuga


method 방법의 단축키br/>hogefuga 객체를 원하는 경우


hoge.:fuga

를 쓸 수 있습니다.


참조: Rubby2.7 새 기능 메소드 참조 연산자


1행과 같은 코드


"https://api.github.com/repos/ruby/ruby".method(:itself)

두 번째 줄~다섯 번째 줄


|>>> URI.:parse
|>>> Net::HTTP.:get
|>>> JSON.:parse
|> call

pipeline operator


Methodbr/>
방법 뒤의 |>를 생략할 수 있는 것을 제외하고는 ()에서 호출하는 방법과 같다p>

Method#>>


.의 경우 왼쪽 가장자리>> 대상의 반환값을 매개 변수로 오른쪽 가장자리를 실행합니다br/>Method의 경우 오른쪽 가장자리의 반환값을 매개 변수로 하고 왼쪽 가장자리의 << 대상을 실행한다br/>
따라서 두 번째 줄~다섯 번째 줄의 코드는 다음과 같은 그림입니다.


|>>> URI.:parse      # URI.parse(1行目の戻り値)を実行
|>>> Net::HTTP.:get  # Net::HTTP.get(URI.parseの戻り値)を実行
|>>> JSON.:parse     # JSON.parse(Net::HTTP.getの戻り値)を実行

참조: Rubby2.6 변경 사항 - Method 및 Proc


5 행에 해당하는 코드


-> {
  JSON.parse(Net::HTTP.get(URI.parse("https://api.github.com/repos/ruby/ruby")))
}.call

여섯째 줄


|> fetch("stargazers_count")

Method에서 다섯 번째 줄 이전에 획득한 JSON의 Hash#fetch 속성을 가져오는 중p>

6행과 같은 코드


JSON.parse(Net::HTTP.get(URI.parse("https://api.github.com/repos/ruby/ruby"))).fetch("stargazers_count")

제7행


|> then { puts @1 }

Object#then


stargazers_count를 블록 매개 변수에 건네주고 블록을 평가하고 블록의 평가 결과를 되돌려줍니다.br/>
6행에서 획득한 JSON 속성selfstargazers_countp>

참조: Object#then


Numbered parameters


블록 매개 변수의 정의를 생략self,@1,@2...다중 대입 가능합니다.
@3 여섯 번째 줄의 반환값을 포함합니다.


참조: Ruby 2.7의 Numbered parameters 테스트


최종 등가 코드


puts JSON.parse(Net::HTTP.get(URI.parse("https://api.github.com/repos/ruby/ruby"))).fetch("stargazers_count")

Ruby 2.7에 추가된 기능은 매우 편리합니다!


Ruby2.7의 추가 기능을 능숙하게 사용할 수 있다면 기분 좋게 코드를 쓸 수 있을 것 같아요!

공부하고 기뻐요!/아니오


연산자 오류


제출에서pipeline operator 이후@1+ 등산자는 사용할 수 없습니다br/>
사용할 수 없는 연산자 일람은 여기. 코드를 통해 확인할 수 있습니다.-의 연산자가 비활성화됨)


※ 왜 pipeline operation 이후에는 계산이 안 나오는 걸까요? 이유를 몰라서 Quora로 질문을 해봤는데 답변을 해주시면 제가 보충해 적을게요.p>

2019/6/15 추기


@yukihiro_matz가 답장했습니다!

Ruby2.왜 7의 piperline operator에서 +와 - 등 연산자가 시작되었습니까?


주요 이유는 읽기가 쉽지 않거나 읽기 어렵다는 것이다.


그 결과


이렇게 됐어요.br/>




pipeline operatorは()でラップしている?


상기 코드op로 호출call하면 상상 속의 행동이 없습니다br/>
함수 합성의 결과가 아니라 .를 수신기JSON.:parse로 불렀기 때문이다br/>
한편, pipeline operator가 원하는 대로 하기 때문에 call로 수신기를 둘러싸고 가격을 매기나요?이런 느낌.(코드를 읽지 않았기 때문에 확실한 증거가 없습니다


("https://api.github.com/repos/ruby/ruby".:itself >> URI.:parse >> Net::HTTP.:get >> JSON.:parse).call

最後に


pipeline operator는 찬반 양론이 있지만 Rubbyist가 행복한 결과를 얻었으면 좋겠네요

그리고 @hanachin_선생님의 코드 덕분에 많이 배웠습니다. 감사합니다@hanachin_선생님


좋은 웹페이지 즐겨찾기