DidYouMean 모듈
DidYouMean 모듈
DidYouMean 젬은 NameError나 NoMethodError 같은 오류가 났을 때 가능성 있는 메서드·클래스 이름을 제안해 주는 기능을 추가해요. Ruby 2.3 이후에서는 시작할 때 자동으로 활성화돼요.
methosd
# => NameError: undefined local variable or method `methosd' for main:Object
# Did you mean? methods
# method
OBject
# => NameError: uninitialized constant OBject
# Did you mean? Object
@full_name = "Yuki Nishijima"
first_name, last_name = full_name.split(" ")
# => NameError: undefined local variable or method `full_name' for main:Object
# Did you mean? @full_name
@@full_name = "Yuki Nishijima"
@@full_anme
# => NameError: uninitialized class variable @@full_anme in Object
# Did you mean? @@full_name
full_name = "Yuki Nishijima"
full_name.starts_with?("Y")
# => NoMethodError: undefined method `starts_with?' for "Yuki Nishijima":String
# Did you mean? start_with?
hash = {foo: 1, bar: 2, baz: 3}
hash.fetch(:fooo)
# => KeyError: key not found: :fooo
# Did you mean? :foo
출처: Ruby 3.3 API
본문
did_you_mean 비활성화하기
가끔은 오류 객체 자체를 디버깅하는 등 did_you_mean 젬을 끄고 싶을 때가 있어요. ruby 명령에 --disable-did_you_mean 옵션을 주면 완전히 비활성화할 수 있어요.
$ ruby --disable-did_you_mean -e "1.zeor?"
-e:1:in `<main>': undefined method `zeor?' for 1:Integer (NameError)
ruby 명령에 직접 접근할 수 없을 때(예: rails console, irb)는 RUBYOPT 환경 변수로 옵션을 적용할 수 있어요.
$ RUBYOPT='--disable-did_you_mean' irb
irb:0> 1.zeor?
# => NoMethodError (undefined method `zeor?' for 1:Integer)
원래 오류 메시지 가져오기
젬을 완전히 끄고 싶지는 않지만 제안 없이 원래 오류 메시지만 필요할 때가 있어요(예: 테스트). 그럴 땐 오류 객체의 #original_message 메서드를 쓰면 돼요.
no_method_error = begin
1.zeor?
rescue NoMethodError => error
error
end
no_method_error.message
# => NoMethodError (undefined method `zeor?' for 1:Integer)
# Did you mean? zero?
no_method_error.original_message
# => NoMethodError (undefined method `zeor?' for 1:Integer)
상수
PlainFormatter—DidYouMean::Formatter는 젬의 기본 포매터예요.message_for메서드에 응답하고 사람이 읽을 수 있는 문자열을 돌려줘요.SPELL_CHECKERSVERSIONVerboseFormatter—DidYouMean::Formatter는 젬의 기본 포매터예요.message_for메서드에 응답하고 사람이 읽을 수 있는 문자열을 돌려줘요.
클래스 메서드
correct_error(error_class, spell_checker)— 주어진 스펠 체커로 오류에DidYouMean기능을 추가해요.formatter()— 현재 설정된 포매터를 돌려줘요. 기본적으로DidYouMean::Formatter로 설정돼 있어요.formatter=(formatter)— 제안을 포맷하는 데 쓰는 기본 포매터를 갱신해요.spell_checkers()— 오류 타입과 스펠 체커 객체의 공유 가능한 해시 맵을 돌려줘요.