2014-09-26 2 views
4

가 나는 종종 아래 코드로, 객체의 순수한 클래스 이름을 얻을해야합니다. 나는이 obj.class.name.split하여 수행 할 수 있습니다 알고루비 순수한 클래스 이름을 부모 이름없이 얻으시겠습니까?

class Foo 
    class Bar 

    end 
end 
obj = Foo::Bar.new 
puts obj.class.name # It shows "Foo::Bar", while what I want is just "Bar" 

(':') 마지막으로,하지만, , 그냥 거기에 "바"를 반환 방법이 없어야합니까?

+0

'Foo.constants [0]'은': Bar' 심볼을 제공합니다. 그러나, 나는 당신의 인스턴스에 메시지를 구성하는 방법을 생각할 수 없다. 'obj'는 이름 문자열을 분리하는 것 외에는 똑같이한다. – dcorking

+0

"바"는 무엇을 사용합니까? – dcorking

+1

예 : 나는 Eat :: Apple, Eat :: Orange, Eat :: Banana, obj = "Eat :: # {fruit}"등 3 가지 클래스를 가지고 있습니다. constantize.new. 내가 먹고있는 과일이 확실하지 않아서 obj.class를 얻어야합니다.판단을위한 이름 – brookz

답변

2

클래스에는 실제로 "이름"이 없습니다. 클래스는 다른 객체와 마찬가지로 객체이며 다른 객체와 마찬가지로 변수에 할당됩니다. 클래스에는 이름이 없으며 숫자처럼 또는 문자열에 이름이 없습니다.

foo = Class.new 

Bar = foo 
Baz = foo 

Bar = nil 
remove_const :Bar 

클래스의 "이름"이 예에서 무엇을해야 :

이 예제를 가지고?

글쎄, 이고 Module 클래스에는 name이라고하는 방법이 있습니다. 그것이 무엇인지는 다음과 같습니다 : 클래스 객체가 처음으로 상수에 할당 된 경우 해당 상수의 이름 (심지어 이 퍼지 개념입니다!)이 클래스의 이름이됩니다. 이름은 nil이됩니다.

는 위의 예에 확장 : 심지어 Quux 불구하고 여전히 그 이름으로 Bar::Quux을 인쇄 foo::Xyzzy를 통해 Baz 내에 정의하고 액세스 할

foo = Class.new 
Bar = foo 
Baz = foo 

class Baz 
    class Quux; end 

    Xyzzy = Quux 
end 

foo::Xyzzy.name 
# => 'Bar::Quux' 

참고 :

foo = Class.new 

foo.name 
# => nil 

Bar = foo 

foo.name 
# => 'Bar' 
Bar.name 
# => 'Bar' 

Baz = foo 

Baz.name 
# => 'Bar' 

Bar = nil 
remove_const :Bar 

foo.name 
# => 'Bar' 

는 여기에 또 다른 예입니다. 클래스는 단순히 인간의 독자들에게 디버깅 도움이됩니다 당신이 결코는 다른 용도로 사용한다

Foo = Class.new 

Bar = Foo 

Foo = nil 
remove_const :Foo 

Foo = Class.new 

Baz = Foo 

Foo = nil 
remove_const :Foo 

Bar.name 
# => Foo 

Baz.name 
# => Foo 

Bar == Baz 
# => false 

"이름"과 :

또한, 두 개의 서로 다른 클래스는 같은 이름을 가질 수 프로그래밍 방식으로 사용하지 마십시오 (심지어 문자열의 특정 구조에 의존적 일 수도 있습니다).

+0

위대한 anwer! 매우 감사합니다! – brookz

0

아니요, 클래스 이름 만 반환하는 메서드는 없습니다. 전문적으로 이름은 외부 모듈과 클래스를 포함하는 경우에만 정확합니다.

#name 방법은 Module 클래스에 정의되어 있습니다. 자세한 내용은 see the documentation을 참조하십시오.

+0

참조 해 주셔서 감사합니다! – brookz

2

바닐라 루비에서 나는 확실히 class.name.split('::').last이 최선의 방법이라고 확신합니다. 그러나 ActiveSupport를 사용하는 경우 (레일스에 있다면이 라이브러리가로드됩니다) demodulize이라는 굴절 장치가 있습니다.

class Foo 
    class Bar 
    end 
end 
obj = Foo::Bar.new 
puts obj.class.name.demodulize # => Bar 
+0

감사합니다. 레일스에 올라와 있습니다. – brookz

관련 문제