DidYouMean 모듈

DidYouMean 모듈

DidYouMean 젬은 NameErrorNoMethodError 같은 오류가 났을 때 가능성 있는 메서드·클래스 이름을 제안해 주는 기능을 추가해요. 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)

상수

  • PlainFormatterDidYouMean::Formatter는 젬의 기본 포매터예요. message_for 메서드에 응답하고 사람이 읽을 수 있는 문자열을 돌려줘요.
  • SPELL_CHECKERS
  • VERSION
  • VerboseFormatterDidYouMean::Formatter는 젬의 기본 포매터예요. message_for 메서드에 응답하고 사람이 읽을 수 있는 문자열을 돌려줘요.

클래스 메서드

  • correct_error(error_class, spell_checker) — 주어진 스펠 체커로 오류에 DidYouMean 기능을 추가해요.
  • formatter() — 현재 설정된 포매터를 돌려줘요. 기본적으로 DidYouMean::Formatter로 설정돼 있어요.
  • formatter=(formatter) — 제안을 포맷하는 데 쓰는 기본 포매터를 갱신해요.
  • spell_checkers() — 오류 타입과 스펠 체커 객체의 공유 가능한 해시 맵을 돌려줘요.