Ruby에서 String#<< 사용시 주의할 점.

[Development]
[code type=ruby][/code]개발 중인 Project에서 ActiveRecord::Base#find 문이 조금 복잡하게 구성이 되야 한다.
그래서 find 문에서 hash 값으로 넘어가는 options 부분을 분리하여, 처리한뒤 find문에 전달한다.
예를 들면
[code type=ruby]
find_options = {}
find_options[:select] = Post::COLUMNS    # Constant
find_options[:conditions] = ...

if query
  find_options[:conditions][0] << [' AND title LIKE ?', '%'+query+'%']
  find_options[:conditions] << query
end
[/code]

위와 같이 코드를 구성하면, 복잡한 조건에 대해서도 깔끔하게 코드를 정리할 수 있다.
그런데 어떤 경우에 hash의 값으로 엉뚱한 값이 들어가 있는 버그가 발견되었다.
디버깅 결과, Constant를 할당하는 부분에서 발생되는 것이었다. 결론부터 말하면
hash의 값으로 Constant를 전달하고, String#<< (Append method)로 값을 추가하면
Constant의 값이 바뀐다. 이는 변수에 전달한 경우도 마찬가지다.

[code type=ruby]
> CONST = '1, 2, 3'
> hsh = {}
> hsh[:test] = CONST
> hsh[:test] << ', 4, 5'  # => 'warning도 없이 깔끔하게(^^;) 추가됨.
> puts CONST
'1, 2, 3, 4, 5'
> hsh[:test] += ', 6'
warning: already initialized constant CONST
[/code]

따라서 위와 같은 경우를 방지하기 위해서, Constant를 할당한 경우는 += 로 String을 추가해야 한다.
2007/02/27 19:09 2007/02/27 19:09
TAG. ,

이 글의 트랙백 주소 :: http://blog.superkdk.com/trackback/43

::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::

[로그인][오픈아이디란?]