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

Ruby 2.4의 9가지 새로운 기능

크리스마스에 새로운 Ruby 버전을 출시하는 것이 전통이 되었습니다.

그리고 이 게시물에서는 Ruby 2.4의 가장 흥미로운 변경 사항 중 일부를 다루려고 합니다. 그러면 뉴스를 따라갈 수 있습니다. 🙂

키워드가 있는 float#round

앱에서 float를 사용하는 경우 floor를 사용하시기 바랍니다. 또는 ceil 반올림을 위해 Float#round 메소드가 Ruby 2.4에서 기본 동작을 변경하기 때문입니다.

:

# Ruby 2.3
(2.5).round
3

# Ruby 2.4
(2.5).round
2

기본 동작은 이제 "가장 가까운 짝수로 반올림"입니다.

<블록 인용>

업데이트 :Float#round의 기본 동작 Ruby 2.4 최종 버전에서 "반올림"으로 돌아갑니다. . 이것은 이 게시물이 처음 게시된 후 Matz가 내린 결정입니다.

또한 Float#round 이제 원하는 반올림 유형을 정의하는 데 사용할 수 있는 인수를 사용합니다.

옵션은 다음과 같습니다.

  • :짝수
  • :위
  • :아래로

:

(4.5).round(half: :up)
5

또한 Float#floor , Float#ceil &Float#truncate 이제 정밀도를 설정할 수 있는 선택적 인수를 사용합니다.

IO 메소드에 대한 Chomp 플래그

gets 또는 each_line과 같은 방법을 사용한 적이 있다면 성가신 줄 바꿈 문자를 처리해야 했던 것을 기억할 것입니다.

다음과 같은 것:\n .

이것은 초보자가 항상 고민하는 부분이지만 이 새로운 기능이 도움이 될 수 있습니다!

다음은 예입니다:

input = gets.chomp
# "abc\n"

이제 Ruby 2.4에서 chomp 키워드 인수 및 gets 줄 바꿈 문자를 제거합니다.

:

input = gets(chomp: true)
# "abc"

이것은 false가 아닌 모든 값에서 작동합니다. 또는 nil (Ruby의 유일한 "falsy" 값).

따라서 이 방법도 작동합니다(그러나 혼동될 수 있으므로 권장하지 않음).

input = gets(chomp: 1234)
# "abc"

대단한 일은 아니지만 메서드 호출을 절약할 수 있습니다 🙂

경로#비어있나요?

Ruby 2.4는 Dir#empty?를 구현합니다. &File#empty? , 이 방법을 사용하면 디렉토리나 파일이 비어 있는지 확인할 수 있습니다(매우 명확하지 않습니까?).

하지만 Pathname#empty? 최근에 추가되었습니다.

Pathname에 익숙하지 않은 경우 , Dir 클래스 및 File 수업.

또한 Pathname을 반환한다는 점에서 "OO"(객체 지향)에 가깝습니다. 문자열 대신 개체.

:

Pathname.empty?("file or directory name")

커밋:https://github.com/ruby/ruby/commit/9373c5efb993dd8cae0526118805449b19af2c22

compare_by_identity 설정

집합은 표준 라이브러리의 일부로 사용할 수 있는 데이터 구조입니다. 독특한 아이템 컬렉션을 유지하는 데 도움이 됩니다.

기본적으로 개체는 해당 값을 기반으로 비교됩니다(또는 더 정확하게는 해시 값을 기반으로 함).

그러나 Ruby 2.4에서는 개체 ID를 기반으로 고유한 개체 집합을 가질 수 있습니다.

:

require 'set'

# Normal set

set = Set.new

set << 123 << 123 << "abc" << "abc"
# [123, "abc"]

# Identity set

set = Set.new().compare_by_identity

set << 123 << 123 << "abc" << "abc"
# [123, "abc", "abc"]

이 기능의 흥미로운 용도를 알고 있는 사람이 있으면 댓글을 남겨주세요 🙂

커밋:https://github.com/ruby/ruby/commit/76977611dd68e384fdce8c546efda5e1931e67a6

Kernel#send, BasicObject#send로 세분화 , 기호#to_proc

여기서 세부적인 개선 사항을 다루지는 않겠지만 기본 아이디어는 String과 같은 클래스에 메서드를 추가할 수 있다는 것입니다. , 이 변경 사항을 하나의 파일이나 클래스로 "현지화"한 상태로 유지합니다.

Ruby 2.4부터 구체화를 통해 정의된 메서드는 Kernel#send와 같은 메서드를 통해 호출될 때 사용할 수 있습니다. &Symbol#to_proc .

:

module TenTimes
  refine String do
    def ten_times
      puts self * 10
    end
  end
end

class Thing
  using TenTimes

  "abc".send(:ten_times)
end

2.3 이하에서 시도하면 '정의되지 않은 방법' 오류가 발생합니다.

커밋:https://github.com/ruby/ruby/commit/35a29390197750abf97ef16fa0740e377764daef

해시#transform_values

다음은 Rails에서 추출하고 Ruby로 직접 오는 또 다른 방법입니다. Hash#transform_values에 대해 이야기하고 있습니다. , Array#map과 유사한 방식으로 작동합니다. .

:

h = {a: 1, b: 2, c: 3}

h.transform_values { |v| v * 10 }
# {a: 10, b: 20, c: 30}

Hash#transform_values!도 있습니다. 제자리 돌연변이가 필요한 경우.

Kernel#clone은 이제 선택적 키워드 인수를 사용합니다.

아시다시피 Ruby 객체의 복사본을 만드는 것이 가능합니다. 이것은 대부분의 Ruby 개체가 변경 가능하고 원본 개체를 변경하지 않으려는 경우에 유용합니다.

개체 복사본을 만드는 두 가지 방법이 있습니다.

  • 복제
  • 중복

복제와 복제 사이에는 몇 가지 작은 차이점이 있지만 이 게시물에서는 clone dup 동안 원래 개체의 "고정" 상태를 유지합니다. 하지 않습니다.

2.4의 새로운 기능은 clone을 호출하는 기능입니다. "동결" 플래그와 함께.

:

foo = "test".freeze
boo = foo.clone(freeze: false)

boo.frozen?
# false

어떤 확장이 유용한지 잘 모르겠지만 더 많은 옵션을 원하지 않는 사람 🙂

커밋:https://github.com/ruby/ruby/commit/320ae01c5fb091eab0926c186f304a9caeda1ace

Thread.report_on_exception

2.4와 함께 제공되는 또 다른 기능은 Thread.report_on_exception입니다. 이것은 스레드 예외가 기본적으로 자동으로 실행되고 코드 문제를 숨길 수 있기 때문에 제안되었습니다.

기본값은 false입니다. 하지만 앱에서 스레드를 사용하는 경우 Ruby 2.4로 업그레이드할 때 이를 활성화해야 합니다.

:

Thread.report_on_exception = true

t1 = Thread.new do
  puts  "In new thread"
  raise "Exception from thread"
end

sleep(1)
puts "In the main thread"

이렇게 하면 예외가 표시되지만 프로그램이 중단되지는 않습니다. 대안은 항상 사용 가능한 Thread.abort_on_exception입니다.

이 메서드의 인스턴스 버전도 있으므로 모든 스레드 대신 스레드별로 이 옵션을 설정할 수 있습니다.

바인딩#irb

binding.pry 사용을 좋아하시나요? 디버깅을 위해? 이제 binding.irb도 있습니다. 비슷한 방식으로 작동합니다.

그러나 irb이기 때문에 구문 강조 표시와 같이 pry가 제공하는 모든 멋진 기능을 얻지는 못합니다.

어떤 이유로 pry에 액세스할 수 없다면 없는 것보다 낫습니다 🙂

커밋:https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a

결론

이 새로운 버전의 Ruby는 많은 흥미로운 기능을 제공하므로 사용 가능한 경우 확인하십시오.

더 많은 사람들이 배울 수 있도록 이 게시물을 공유하는 것을 잊지 마세요. Ruby 2.4의 새로운 기능에 대해 알아보세요!