크리스마스에 새로운 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의 새로운 기능에 대해 알아보세요!