pipeline operator가 사용하는 인코딩을 읽고 발견했습니다!
개시하다
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/>hoge
의 fuga
객체를 원하는 경우
hoge.:fuga
를 쓸 수 있습니다.
1행과 같은 코드
"https://api.github.com/repos/ruby/ruby".method(:itself)
두 번째 줄~다섯 번째 줄
|>>> URI.:parse
|>>> Net::HTTP.:get
|>>> JSON.:parse
|> call
pipeline operator
Method
br/>
방법 뒤의 |>
를 생략할 수 있는 것을 제외하고는 ()
에서 호출하는 방법과 같다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 속성self
은 stargazers_count
p>
참조: 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/>
나는 보통 "이렇게 하면 움직일 수 있겠지"라는 마음이 있다.
— Miyagi (@hanachin_) 2019년 6월 14일
"https://t.co/8sUOXpGLwt"itself >> URI.:parse >> Net::HTTP.:get >> JSON.:parse
|> call
|> fetch "stargazers_count"
|> then { puts @1
}
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_선생님
Reference
이 문제에 관하여(pipeline operator가 사용하는 인코딩을 읽고 발견했습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sanfrecce-osaka/items/9397e518033d6ff08c65텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)