2010-12-07 4 views
2

우리 앱은 send 메서드를 사용하여 객체의 함수를 호출합니다. 불행히도 send에 전달 된 문자열이 Ruby에서 적법한 메소드 이름이 아닐 수도 있습니다. 누구든지 이것을 확인할 수있는 정규 표현식을 알고 있습니까?함수 이름과 일치하는 Ruby 정규식이란 무엇입니까?

합법적으로 "?"등으로 시작하지 않는 메서드 이름을 의미합니다.이 경우에는 method_missing을 사용하기 때문에 개체가 메서드에 응답하는지 여부는 중요하지 않으며 실제로 필요합니다. 이것은 객체가 응답하지 않는 메소드에서만 발생합니다.

기술적으로, 나는 정규 표현식 does this을 찾고 있어요 :

루비 식별자 알파벳, 진수 및 밑줄 문자로 구성하고 (밑줄 포함) 알파벳으로 시작됩니다. 여기 은 루비 식별자의 길이에 제한이 없습니다.

+0

, which'd 이 질문과 다소 관련이 있지만 찾을 수 없습니다. –

답변

14

유효 식별자가 아닌 경우 Symbol#inspect이 이름을 인용한다는 점을 이용할 수 있습니다. 검사 할 때 유효한 기호는 ":hello!"이되지만 올바르지 않은 기호는 ":\"invalid!?\""이됩니다. 이것은 :foo=, :[]= 및 기타 유효한 메서드 이름과 같은 이국적인 기호를 처리합니다.@ -names가 유효 식별자가 아닌 유효한 메소드 이름이라는 추가 요구 사항을 추가

우리에게주는이 : 나는 변수 이름과 일치하는 정규 표현식에 대한 SO에 질문이라고 생각

class Symbol 
    def method_name? 
    return /[@$"]/ !~ inspect 
    end 
end 
+1

와우, 매우 우아함. 오늘 내 표를 사용했습니다. – Phrogz

+0

나는 그것을 좋아한다! 나는 아직 광산을 사용하지 않았기 때문에 당신을 +1 할 것이다. –

+0

이것은 상황을 처리하는 가장 좋은 방법이다. 루비가 스스로 재현하려고 시도하지 않고 휴리스틱 스를 사용하도록 의지하고, 실패/불일치가있을 때이를 감지합니다. Symbol 대신 Object의 일부가되어야한다고 생각하지만 Symbol이 수행합니다. –

4

합법적 인 메소드 이름이지만 전송하려는 객체에 메소드가 실제로 존재하지 않습니다.

어느 쪽이든 문자열이 합법적 인 메서드 이름이 아니더라도 개체를 호출하기 전에 메서드에 응답하는지 확인해야합니다. Object#respond_to? 메서드를 사용하여이 작업을 수행 할 수 있습니다. 예를 들어

:

obj = Person.new 
method = "set_name" 

if obj.respond_to?(method) 
    obj.send(method, "foo") 
end 

당신은 문자열 당신이 ... /^([a-zA-Z_]+|\[\])[\?!=]?$/ 같은 일반적인 방법에 대한 작업을해야 정규 표현식을 사용 싶어 합법적 인 방법 이름입니다 있는지 확인하려면

. 에 관계없이 내 포인트는 여전히

def could_be_method_name?(m) 
    match = /^([a-zA-Z_]([\w]*[\w!?=]$){0,1})/.match(m) 
    return match == nil ? false : match[1].length==m.length 
end 

루비 메소드 이름이로 시작해야 시도있어 여기에 내가 정규 표현식 여기 길을 가야하는 것입니다 그래서 잘 모르겠어요이 객체 메소드 이름

+0

합법 메소드 이름은 메소드 이름으로 Ruby에서 인식하는 메소드입니다. 예를 들어'? echo'는 적법 메소드 이름이 아닙니다. –

+1

맞아요, 객체를 호출하기 전에 객체가 메소드에 응답하는지 확인해야한다는 것입니다. downvoting하기 전에 시도 했습니까? –

+1

+1 어리석은 downvoting을 상쇄하는 – ryeguy

0

반응을 확인하는 의미하지만, 편지 또는 밑줄. 영숫자 문자 만 포함 할 수 있지만 마지막 문자는!,? 또는 =가 될 수 있습니다.

+0

"[]", "[] =", "<<"등의 대문자 메서드 이름 (유효한 것이지만 일반적이지는 않습니다) –

+0

@ JonaElfström 길이를 테스트하는 대신 정규식을 입력의 시작과 끝 :'/ \ A ... \ z /'. (이 상황에서 개행 문자는 없을 것입니다 만,'^'는 입력의 시작이 아니라 행의 시작에 불과합니다.) – Phrogz

1
소스 코드에서 허용

루비 방법 식별자이 일치 할 수 있습니다

# Yes, upper-case first letters are legal 
/\A(?:[a-z_]\w*[?!=]?|\[\]=?|<<|>>|\*\*|[!~+\*\/%&^|-]|[<>]=?|<=>|={2,3}|![=~]|=~)\z/i 

그러나, 방법이이 패턴과 일치하지 않는 정의 할 수 있습니다 :

class Foo 
    define_method("!dumb~name"){ puts "yup" } 
end 
Foo.new.send('!dumb~name') 
#=> yup 

편집을 : Operator Expressions을 모두 추가하도록 업데이트되었습니다.

관련 문제