본문 바로가기

소프트웨어 이야기/장고와 루비온레일즈

[루비스타일가이드]RUBY String의 to_s와 +=

회사에서 최근 품질관리를 위하여 루보콥을 사용하고 있다.

어떻게 사용하고 있냐 하면은, git을 커밋할 때 마다 루보콥이 돌고 remote 브랜치에 push를 할 때면 RSPEC이 돈다.

그래서 commit 할 때, Rubocop과 Rspec이 도는 것을 이번 주에 처음 해보았다.

RSPEC이 REMOTE push 때마다 매번 도는건 여전히 귀찮지만 루보콥이 도는건 꽤 만족한다. 루보콥에서 걸린 것들을 고쳐나가면서, 루비 스타일 가이드를 읽게되니 기존의 소스코드가 아닌 다른 방법으로 루비를 배워가는 기분이여서 좋다 ㅎㅁㅎ 

그러면서 알게된 String Class와 관련된 루비 스타일 가이드를 정리해보고자 한다. 


1. to_s를 쓰지 말라! [link]

"#{object}" 

이런식으로 "#{ }" String 형태 안에 값을 넣을 경우, 굳이 to_s로 객체를 String으로 변환해주지 않아도 된다. 왜냐하면 " " 함수 안에서 자동으로 to_s 기능을 주입시켜 준다고 한다! 


# 그니까... 만약 아래처럼 해시값을 ""안에 찍어서 보고 싶은 경우, 굳이 to_s를 하지 않아도 에러가 안난다는 것! 

hash_object = {a: 1, b:2}

puts "#{hash_object}"



2. += 보다는 <<를 써라 ! 

좀 큰 구문들을 저장할 때에는 String의 +를 사용하기 보다는 String의 << 를 사용하는 것을 권장한다고 한다. 여기서 <<로 String 객체를 다루면 한 객체를 계속 바꾸는 거여서 (Concatenation mutates the string instance)! 새로운 String 객체를 생성하는 String의 +보다 더 빠르다!


3. String#gsub += 보다 tr 또는 sub 을 사용하라! 

gsub보다는 sub이나 tr을 쓰는게 더 빠르다고 한다.

tr은 단일  character 값을 바꿀 때 사용한다! abc에서 a만 바꾸고 싶을 때!

sub은 regex에 매칭되는 전체 값을 바꾸는게 아니라 첫번째 매칭되는 값만 바꾸고 싶을 때 사용!

gsub은 regex에 매칭되는 모든 값들을 바꿀 때 사용! 

뭐 결론은... 다 매칭되는지 보지 않고 첫번째만 매칭되는거 보고 로직을 빠져나가는 sub이 gsub보다 낫다는 건감..?


gsub vs sub

gsub : regex에 맞는 모든 값들을 변경한다.

value = 'abc abc' 

value.gsub('abc','---') 

# retrun 되는 값 => '--- ---'


sub : regex에 맞는 가장 첫번째 값만 변경한다.

value = 'abc abc' 

value.gsub('abc','---') 

# retrun 되는 값 => '--- abc'