'Constant'에 해당되는 글 1건

  1. [2007/02/27] Ruby에서 String#<< 사용시 주의할 점.

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. ,