2014-02-21 2 views
0

IRB 시작시 사용자 지정 파일, 모듈 및 클래스를 많이로드하여이를 향상시킵니다.IRB를 확장하여 원하는 방법으로 "필터링"방법을 찾을 수 없습니까?

나에게는 많은 도움이되는 수업이 있지만 자동으로 호출하는 방법을 모른다. 이 컨텍스트에서 자동으로 의미하는 것은 : IRB를 시작할 때, 그리고 메서드 나 변수가 아닌 무언가를 입력 할 때, 내가 선택한 사용자 지정 메서드를 호출하고 싶습니다.

rescue 또는 method_missing 중 하나를 통해 느슨하게 알 수 있지만 어느 쪽을 할 것인지 잘 모르겠습니다. 누군가가 "foo"와 같은 IRB에 알려지지 않은 메서드를 입력하면 IRB (또는 irbrc) 메서드를 호출하는 방법을 보여줄 수 있습니까?

답변

1

정말 짜증나는 것처럼 보입니다.하지만 어떻게 할 수 있습니다. , 분명히

def self.method_missing (name, *args, &block)         
    puts "#{name} is not a method, ya goof"          
end 

누락 방법이 잡힌 때 발생하는 변경하는 방법 정의의 내용을 변경하여 .irbrc이 추가.

이제 irb에서 main 개체의 메서드를 호출 할 때마다 누락 된 메서드를 catch합니다.

이것은 최상위 메소드 호출을위한 것입니다. 혹시 메소드 호출 누락 모든을 잡을하려면, 대신이 추가

class Object 
    def method_missing (name, *args, &block) 
    puts "#{self.class}##{name} is not a method, ya goof" 
    end 
end 

이 당신에게 당신은 아마하지 않는 것이 실패 메서드 호출을 많이 공개하는 것입니다 명심 알아.

$ irb 
String#to_int is not a method, ya goof 
>> foo 
NilClass#to_ary is not a method, ya goof 
Object#foo is not a method, ya goof 
=> nil 
>> [].bar 
Array#bar is not a method, ya goof 
=> nil 

나는 이것이 당신이 장기적으로 함께 살기를 원하는 것이 될 것이라고 생각하지 않지만, 어떻게 해야할지 생각합니다. 너 자신을 노크해라!

+0

거의 완벽합니다. 한 가지 질문이 있습니다. 원래 오류 메시지는 어디에 있습니까? 예를 들어, irb에 "foo"라고 입력하면, NameError : undefined 지역 변수 또는 main : Object에 대한 메소드'foo '를 얻습니다. 그러나 method_missing을 사용하면 오류가 완전히 사라진 것으로 보입니다. – shevy

+0

정상적인 NoMethodError가 다시 발생되기를 원하면 메소드 정의의 맨 끝에'super' (괄호 안 함)를 던질 수 있습니다. –

2

나는 다른 접근 방식을 선택 것 : 대신 클래스

  • 의 모듈에 필요한

    • 넣어 모든 방법을 항상 자동적를에 foo.rb와 객체 include이 모듈
    • 시작 IRB가 당신의 정의를로드

    foo.rb :

    module Foo 
        def my_method 
        puts "aye" 
        end 
    end 
    
    
    class Object 
        include Foo 
    end 
    

    이제 irb에 my_method을 입력하면 메소드가 호출됩니다.

  • +0

    알았어.하지만 내가 부를 수있는 방법을 알아야 겠어.그러나 나는 항상 그것을 알지 못합니다. "foolalalblee"방법과 다른 하나의 "lililalala"(좋아, 예제를 만들었지 만 아이디어를 얻는다면, 모두를 정의하는 데 오랜 시간이 걸립니다) 대신, 나는 내가 처리하는 방법을 모르는 메서드를 전문화 된 클래스에 위임하려면 실제로 하나의 메서드 (누락 된 메서드) 만 호출하면 거기에서 입력을 통해 수행 할 작업을 결정해야합니다. 때로는 입력이 오류가 발생해야하는 경우도 있고 때로는 다른 클래스를 향해 전달해야하는 경우도 있습니다. – shevy