2011년 6월 2일 목요일

Standard Types : Strings

Strings

루 비에서 모든 문자열은 String 클래스의 객체이다. 문자열 리터럴은 구분 문자 사이에 문자 시퀀스르 쓰는 것이다. 작은 따옴표로 묶인 문자열에서는 역슬래시 두 개를 나란히 쓰면 역슬래시 하나로 변환되고, 역슬래스 다음에 작은 따옴표를 쓰면 작은 따옴표 하나로 변환된다.
'escape using "\\"'»escape using "\"
'That\'s right'»That's right


큰 따옴표로 묶인 문자열에서는 개행문자를 사용할수 있고, #{exp}과 같은 식으로 쓰면 루비 코드의 결과를 문자열로 변환해 준다. 만일 #{} 안의 표현식이 전역변수, 클래스 변수, 인스턴스 변수라면 중괄호를 생략해도 된다.
"Seconds/day: #{24*60*60}"»Seconds/day: 86400
"#{'Ho! '*3}Merry Christmas"»Ho! Ho! Ho! Merry Christmas
"This is line #$."»This is line 3


삽입되는 코드는 한 줄 이상의 명령문이어도 된다.
%q, %Q는 각각 작은 따옴표와 큰 따옴표를 의미한다.
%q/general single-quoted string/»general single-quoted string
%Q!general double-quoted string!»general double-quoted string
%Q{Seconds/day: #{24*60*60}}»Seconds/day: 86400


q, Q 다음에 오는 것은 구분 문자로 /,!,{를 사용하였다면 알맞은 짝으로 닫는 문자가 나올때까지를 유효 범위로 인지한다.

"here document"를 이용하여 문자열을 만들 수도 있다.

aString = <<END_OF_STRING
   The body of the string
is the input lines up to
one ending with the same
text that followed the '<<'
END_OF_STRING

here document는 "<<"다음에 특정 문자열이 오는 종결 문자열을 정의한다. 종결 문자열에 마이너스(-)를 사용하면 문자열도 들여쓰기 할 수 있다. here document를 사용할 때 문자열 앞쪽의 공백 문자를 제거하지 않는 다는 사실에 주의해야 한다.

print <<-STRING1, <<-STRING2
Concat
STRING1
    enate
    STRING2

Concat
   enate

Working with Strings

String 클래스는 75개가 넘는 표준 메서드를 표함하고 있다. 일반적으로 자주 사용하는 메서드만 살펴본다.

String#split

아래와 같은 노래의 정보를 담고 있는 파일이 있고, 파일을 읽어서 Song 객체를 생성하는 메서드를 구현해본다.

/jazz/j00132.mp3 | 3:45 | Fats Waller | Ain't Misbehavin'
/jazz/j00319.mp3 | 2:58 | Louis Armstrong | Wonderful World
/bgrass/bg0732.mp3| 4:09 | Strength in Numbers | Texas Red

==>
songs = SongList.new

songFile.each do |line|
   file, length, name, title = line.chomp.split(/\s*\|\s*/)
songs.append Song.new(title, name, length)
end
puts songs[1]

>>Song: Wonderful World--Louis Armstrong (2:58)

split 메서드에 정규표현식 /\s*\|\s*/을 사용하면 공백를 포함한 세로 막대로 잘라서 토큰 배열을 반들수 있다.  그리고 파일에서 읽은 줄의 끝부분에 개행문자를 포함하기 때문에 sprint 전에String#chomp를 이용하여 개행문자를 제거해야 한다.

String#squeeze

만일 노래 제목 사이에 공백이 여러번 반복되어 들어가 있어서 이를 제거 해야 한다면 squeeze 메서드를 사용하여 제거할수 있다. squeeze 메서드는 반복되는 문자열을 제거해 준다.

name="Wonderful World"
name.squeeze!(" ")
puts name

>> Wonderful World

songs = SongList.new

songFile.each do |line|
   file, length, name, title = line.chomp.split(/\s*\|\s*/)
    name.squeeze!(" ")
    songs.append Song.new(title, name, length)
end
puts songs[1]

! 사용은 수신자를 직접 바꾸겠다는 의미다. name에서 공백을 제거하고 name에 다시 담지 않고 사용할 수 있다.

String#scan

scan 메서드는 split과 매우 유사하다. split은 주어진 패턴으로 나누지만 scan 메서드에서는 주어진 패턴에 매치되는 부분을 리턴한다. 12:34에서 12, 34을 분리 한다면 사용법은 아래와 같다. /\d+/는 하나이상의 숫자를 나타내는 패턴이다.

name="12:34"
puts name.split(/:/)
puts name.scan(/\d+/)

>> 12
>> 34
>> 12
>> 34

String#downcase, String#upcase

문자열의 대소문자 변환을 할때 사용한다.

name="Wonderful World"
name.squeeze!(" ")
name.downcase!
puts name
name.upcase!
puts name

>> wonderful world
>> WONDERFUL WORLD

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...