Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 2.7의 새로운 기능, 방법 및 개선 사항

Ruby는 개선을 멈추지 않습니다!

버전 2.7에는 새로운 기능, 방법 및 성능 개선 사항이 포함되어 있습니다. 2019년 12월 25일에 출시되었습니다.

이제 Matz에 따르면...

이것은 마지막 2.x 버전 릴리스입니다. 내년에 Ruby 3.0이 출시되기 때문입니다!

하지만 도착하기 전에...

버전 업데이트를 준비할 수 있도록 2.7의 몇 가지 변경 사항 및 새로운 기능을 살펴보겠습니다.

내용

  • 열거 가능한 #tally 1개
  • 블록에 대한 2개의 번호가 매겨진 매개변수 [실험]
  • 3배열#교차로
  • 4 열거 가능#filter_map
  • 5 열거자#create
  • 6 IRB가 성형 수술을 받습니까?
  • 7 루비 패턴 매칭 [실험]
  • 8 기타 변경 사항
  • 9 요약
    • 9.1 관련

열거 가능한 #tally

이것은 배열의 모든 요소를 ​​계산하고 해당 개수와 함께 해시를 반환하는 새로운 Ruby 메서드입니다.

직접 할 수도 있지만 이 tally 방법을 사용하면 작업을 절약할 수 있습니다.

예시 :

%w(a b b c).tally

결과 :

{"a"=>3, "b"=>2, "c"=>1}

좋아요!

블록의 번호 매기기 매개변수 [실험]

내가 한동안 원했던 흥미로운 새 기능은 블록 매개변수의 기본 이름입니다.

다음은 하나의 매개변수가 있는 일반 블록입니다. :

[1,2,3].각 { |n| n을 넣습니다 }

|n| 사용하려면 정의해야 하는 매개변수입니다.

하지만 기본 이름이 있다면 어떨까요?

이는 실험적 기능이지만 Ruby 2.7이 제공하는 장점 중 하나입니다. , 입력하는 시간을 많이 절약할 수 있습니다.

모양은 다음과 같습니다. :

[1,2,3].각 { _1 }

_1 위치 첫 번째 매개변수를 참조하면 _2를 사용할 수 있습니다. 두 번째 항목이 있는 경우 예, _3 세 번째 매개변수 등

멋져!

자, 약간의 퀴즈입니다.

이 기능은 처음에 @1처럼 보이도록 제안되었습니다. , 하지만 인스턴스 변수와 너무 비슷해 보여서 논의 끝에 _1을 사용하기로 결정했습니다. 대신.

배열#교차로

이것은 새로운 방법이지만 새로운 기능은 아닙니다.

사실...

이것은 별칭에 가깝습니다!

Ruby 2.6에서 Array union 도입 &difference 메소드, Array#|의 보다 간결한 항목과 일치시키기 위해 및 Array#- .

하지만 누락된 작업은 intersection이었습니다. , 기억하기 힘든 또 다른 짧은 버전이 있습니다.

Array#& method .

지금 :

이 방법은 무엇을 하며 어떻게 작동합니까?

:

[1, 2, 3].교차로([2, 3, 4])# [2, 3][1, 2, 3] &[2, 3, 4]# [2, 3] 

음...

이름은 intersection을 제공합니다. 두 배열 사이의 교차점을 찾습니다. 즉, 어떤 요소가 공통점이 있는지 찾습니다.

짧은 버전 긴 버전
& 교차로
| 연합
차이

나는 항상 이 3가지 방법 중 어떤 것이 무엇을 하는지 잊어버립니다!

그러나 이러한 새로운 방법을 사용하면 기억하기가 훨씬 쉬워집니다 이름에 의미가 있는 .

좋은 코드 작성에 대한 좋은 교훈입니다.

열거 가능한#filter_map

filter_map 메소드는 select를 결합하려는 시도입니다. &map 방법을 하나로.

왜?

목록을 먼저 필터링한 다음 나머지 요소를 매핑하는 것이 일반적인 작업이기 때문입니다.

두 가지 방법으로 수행할 수 있습니다. :

(1..8).select(&:짝수?).map { |n| n ** 2 }# OR(1..8).map { |n| n ** 2인 경우 n.even? }.컴팩트

둘 다 사용했지만 의도가 더 명확하기 때문에 전자에 치우치는 경향이 있습니다.

지금 :

Ruby 2.7에서 이 filter_map 메서드는 한 번에 이 작업을 수행합니다.

좋아요 :

(1..8).filter_map { |n| n ** 2인 경우 n.even? }# [4, 16, 36, 64]

저는 블록 내부에 if 문을 사용하는 것을 가장 좋아하는 편은 아니지만 때로는 작업을 완료하는 데 필요합니다.

그 외에도 알아야 할 사항이 있습니다.

filter_map 작업이 map + compact처럼 작동하지 않습니다. , false를 제거하기 때문에 개체 및 compact 그렇지 않습니다.

기억해두면 좋은 점!

열거자#생성

여기 당신이 흥미롭게 생각할 수 있는 또 다른 새로운 방법이 있습니다. 그러나 약간의 창의성이 필요할 수 있습니다 최대한 활용하세요.

Enumerator#produce입니다. 방법.

어떤 역할을 하나요?

기능 제안에 따라 :

<블록 인용>

"이 방법은 이전 요소에 블록을 적용하여 각 다음 요소를 계산하는 무한 시퀀스를 생성합니다."

네.

끝없는 시퀀스를 만드는 또 다른 방법!

예시 :

Enumerator.produce(1, &:next).take(5)# [1, 2, 3, 4, 5]

이 예에서는 take(10)를 수행해도 문제가 되지 않습니다. 또는 take(10_000) , 무한한 수의 값을 얻을 수 있습니다.

Btw, 1 초기값입니다.

그리고 &:next produce을 위해 해당 값에 대해 호출되는 메서드입니다. 시퀀스의 다음 요소입니다.

IRB가 성형 수술을 받습니까?

최근 IRB는 많은 사랑과 관심을 받고 있으며 Ruby 2.7은 계속해서 추가되고 있습니다.

우리는 :

  • 여러 줄 편집
  • 구문 강조
  • 내장된 RDoc 통합
  • 기본적으로 사용되는 명령 기록
  • 기본적으로 자동 완성 사용

사실 :

이것은 Ruby 2.7로 irb를 시작할 때 경고를 받을 정도로 큰 변화입니다.

이전 버전의 irb를 계속 사용하려면 irb --legacy를 사용하면 됩니다. 명령. 이 새 IRB의 주요 문제는 줄 편집입니다. 기존 IRB(또는 Pry)에서는 ALT 키를 누른 상태에서 왼쪽 화살표를 눌러 더 빠르게 이동할 수 있지만 새 IRB에서는 작동하지 않습니다.

사용해 보고 어떻게 작동하는지 확인하십시오.

루비 패턴 매칭 [실험]

2.7에서 제공되는 자주 요청되는 기능은 패턴 일치입니다.

실험용으로 표시됩니다.

하지만 패턴 매칭은 무엇이며 어떤 이점이 있습니까?

글쎄, 내가 이것을 올바르게 이해한다면 패턴 매칭은 정규 표현식과 같지만 데이터 구조(Array/Hash)에 대한 것입니다.

예시 :

[1,2,3] in [a,b,c] # true[1,2,3] in [a] # false

일치하는 항목이 있으면 이러한 변수 이름(예:a ) 액세스할 수 있는 지역 변수가 됩니다.

해시를 사용한 예 :

{ a:1, b:2, c:[] } in { a:a, b:b, c:[] }# truep a# 1

이것은 in을 사용합니다. 키워드.

새로운 것은 아니지만 Ruby 2.7 in 이전이기 때문에 흔하지 않습니다. for의 일부로만 사용되었습니다. 루프(Ruby에서는 적극 권장하지 않음)이므로 이 키워드를 유용한 용도로 재사용할 수 있습니다.

더 좋아짐

어떤 변수를 사용하든 상관없습니다. a,b,c 여기에서 작동하지만 f,g,h 또한 작동합니다.

패턴에 관한 모든 것입니다!

기타 변경 사항

언급할 가치가 있는 몇 가지 추가 변경 사항입니다.

  • 새로운 압축 GC로 메모리 조각화 개선
  • 메서드 인수 **nil 이제 메소드가 키워드를 사용하지 않는다고 선언합니다.
  • 메서드 인수 ... 인수 전달 메커니즘을 추가합니다(make_salad(...)와 같이 괄호 필요). )
  • 섬유 개선. 새로운 섬유 개체 풀(새 섬유가 할당됨)은 섬유를 더 효율적으로 만듭니다.
  • 스레드 개선. 스레드를 생성하는 더 우수하고 최적화된 방법으로 멀티스레딩이 빨라집니다.

이에 대해 어떻게 생각하십니까?

2.7용 NEWS 파일에는 파이버 및 스레드 생성 모두에서 10배의 성능 향상이 언급되어 있습니다. 직접 테스트하지는 않았지만 결과를 알려주시면 감사하겠습니다.

요약

이제 Ruby 프로그래밍 언어의 최신 변경 사항을 확인했습니다! IRB 변경, 새로운 방법 및 패턴 일치와 같은 몇 가지 실험적 기능에 대해 배웠습니다.

이 기사를 공유하여 뉴스를 퍼뜨리세요!

읽어주셔서 감사합니다 🙂