2016-10-23 4 views
4

클래스/모듈 이름 즉 얻을 수있는 더 나은 방법이 있나요, 그리고 A::B::C에서 A. 다음 코드는 문자열과 분할을 사용하여 "Stegosaurus"Cowsay::Character::Stegosaurus에서 가져 오는 방법입니다. 문자열 및 분할 방법을 없애는 방법은 무엇입니까?<code>C</code><code>B</code>, <code>A::B::C</code>에서 <code>A::B::C</code>에서 가져 오기 클래스/모듈 이름

require 'cowsay' 
x = Cowsay.random_character().class 
x.name.split("::")[2] 
require 'cowsay' 
true 
x = Cowsay.random_character().class 
Cowsay::Character::Stegosaurus 
x.name.split("::")[2] 
"Stegosaurus" 

감사

+0

'A :: B :: C '를 문자열로 변환하지 않고 각 요소를 추출하고 싶다고 올바르게 이해하고 있습니까? 이 예제에서'A'는 모듈이지만'B'와'C'는 모듈이 아니며 Ruby 오브젝트조차도 아니므로 여러분이 할 수있는 최선의 방법은'A' 또는''A''이고''B "및"C ". 어쨌든 문자열로 끝나기 때문에'A :: B :: C'를 문자열로 변환하지 않는 이유는 무엇입니까? –

+0

위의 설명에서 명확하지 않은 경우 A :: B :: C는 3 개의 중첩 모듈 인 A, A :: B 및 A :: B :: C가 있음을 나타냅니다. 'B'와'C'는 모듈이 아닙니다. 'A :: C'와'B :: C' 모듈을 정의했다면'C' 모듈을 가리키는 것이 무슨 뜻일까요? –

+2

IMO'split ("::") [2]'나쁘지 않습니다. 확실히 activesupport를 요구하는 것처럼 나쁘지 않습니다. 그것은 간단하고 일을합니다. – Max

답변

4

내가 코어/표준 라이브러리에서이 문제를 처리하기위한 거기에 아무것도 생각하지 않습니다. 대안으로

사용자 정의 항상 activesupport이 방법을 작성하려면 다음과 같이

require 'active_support/core_ext/string/inflections' 
Cowsay::Character::Stegosaurus.name.demodulize 
#=> "Stegosaurus" 
Cowsay::Character::Stegosaurus.name.deconstantize 
#=> "Cowsay::Character" 

이 방법이 구현 자세한 방법에 관심이 있다면

def demodulize(path) 
    path = path.to_s 
    if i = path.rindex('::') 
    path[(i+2)..-1] 
    else 
    path 
    end 
end 

def deconstantize(path) 
    path.to_s[0, path.rindex('::') || 0] # implementation based on the one in facets' Module#spacename 
end 

는보고 into docs을 가져 가라.

으로는 전체 activesupportrequire을 거라고 경우 A::B::C

에서

A에, 당신은 parent 포함 Module 방법의 무리를 얻을 것 :

require 'active_support' 
Cowsay::Character::Stegosaurus.parent 
#=> Cowsay 

하는 경우 너는 그것을 광범위하게 사용하지 않을 것이다. 나는 단지 n을 잡을 것을 권한다.에서 eeded 메소드를 가져 와서 일부 도우미에 넣으십시오. 전체를로드하는 것은 과도 할 수 있습니다.

+2

필요한 경우 유용한 방법 추출에 대한 좋은 지적. 오픈 소스를 갖는 것이 좋습니다. 필요한 경우 부품을 언제든지 빌릴 수 있습니다. – tadman

관련 문제