[루비 사용자 가이드] 스트링

루비/레일스 프로그래밍/루비 사용자 가이드 2007.04.27 23:52

루비는 수 뿐 아니라 스트링도 잘 다룰 수 있습니다. 스트링은 큰따옴표("...")나 작은 따옴표('...')를 사용할 수 있습니다.

ruby> "abc"
   "abc"
ruby> 'abc'
   "abc"

큰따옴표와 작은 따옴표는 몇 가지 차이가 있습니다. 큰 따옴표 스트링은 백슬래시를 사용한 문자 이스케이프와 #{}를 사용하여 스트링에 내포된 식의 계산을 허용합니다. 작은 따옴표 스트링은 이런 변환을 하지 않습니다. 따라서 작은 따옴표 스트링에서는 여러분의 눈에 보이는 것이 실제 그 스트링과 정확히 일치합니다. 다음은 몇 가지 예제입니다:

ruby> puts "a\nb\nc"
a
b
c
   nil
ruby> puts 'a\nb\n'
a\nb\nc
   nil
ruby> "\n"
   "\n"
ruby> '\n'
   "\\n"
ruby> "\001"
   "\001"
ruby> '\001'
   "\\001"
ruby> "abcd #{5*3} efg"
   "abcd 15 efg"
ruby> var = " abc "
   " abc "
ruby> "1234#{var}5678"
   "1234 abc 5678"

루비에서는 C에서보다 더 자연스럽고 똑똑하게 스트링을 다룰 수 있습니다. 예를 들어 스트링을 +로 서로 붙일 수 있고, *로 여러 번 반복할 수 있습니다:

ruby> "foo" + "bar"
   "foobar"
ruby> "foo" * 2
   "foofoo"

C에서 스트링을 붙이는 것은 명시적으로 메모리를 관리해야 하기 때문에 훨씬 더 복잡합니다:

char *s = malloc(strlen(s1)+strlen(s2)+1);
strcpy(s, s1);
strcat(s, s2);
/* ... */
free(s);

하지만 루비에서는 스트링이 메모리를 얼마나 사용할지를 프로그래머가 고민할 필요가 없습니다. 우리는 모든 메모리 관리로부터 자유롭습니다.

스트링을 가지고 할 수 있는 일은 어떤 것이 있을까요?

붙이기:

ruby> word = "fo" + "o"
   "foo"

반복하기:

ruby> word = word * 2
   "foofoo"

문자 뽑아내기(루비에서는 문자가 정수라는 것에 주의하세요):

ruby> word[0]
   102            # 102는 `f'의 아스키코드입니다.
ruby> word[-1]
   111            # 111은 `o'의 아스키코드입니다.

([]안에서 음수를 사용하면 스트링의 끝에서부터 인덱싱을 합니다. 양수인 경우엔 물론 앞에서부터 하지요.)

서브스트링 뽑아내기:

ruby> herb = "parsley"
   "parsley"
ruby> herb[0,1]
   "p"
ruby> herb[-2,2]
   "ey"
ruby> herb[0..3]
   "pars"
ruby> herb[-5..-2]
   "rsle"

같은지 비교하기:

ruby> "foo" == "foo"
   true
ruby> "foo" == "bar"
   false

이제 이런 특징을 사용해 무언가 재미있는 일을 해 봅시다. 이 예는 "단어 추측하기" 퍼즐입니다. 아마도 "퍼즐"이란 단어는 다음과 같은 프로그램에 붙이기엔 너무 고상한 말이겠지만요. ;-)

# guess.rb라는 이름으로 저장하세요.
words = ['foobar', 'baz', 'quux']
secret = words[rand(3)]

print "guess? "
while guess = STDIN.gets
  guess.chop!
  if guess == secret
    puts "You win!"
    break
  else
    puts "Sorry, you lose."
  end
  print "guess? "
end
puts "The word was ", secret, "."

지금 현재로써는 위의 코드 안의 자세한 부분에 대해 모른다고 너무 괴로워하지 마세요. 다음은 위 프로그램을 실행시킨 한 예입니다.

% ruby guess.rb
guess? foobar
Sorry, you lose.
guess? quux
Sorry, you lose.
guess? ^D
The word was baz.

(아마도 이보다 더 잘 할수 있었겠죠. 확률은 1/3이니까...)



Trackbacks 0 : Comments 0

Write a comment