2014-04-19 1 views
1

상속 된 익명 클래스의 name을 얻을 가능성이 있으며 "실패 A"를 발생시키지 않습니까? Class 개체 생성을 통해 이루어져야합니다 (평가 또는 유사하지 않음). 이 특정 상수로 설정 될 수 없도록 익명의 클래스가 아직 초기화되지 않기 때문에상속 된 프로세스에서 익명 클래스의 이름을 가져옵니다.

class A 
    def self.inherited(base) 
    raise 'fail A' unless base.name 
    end 
end 

B = Class.new(A) 
# or 
Object.const_set :B, Class.new(A) 

위의 코드는 작동하지 않습니다. 이 상수 (예를 들어, (B = Class.new).name #=> "B")에 할당 된 때까지

답변

5

번호

익명 클래스는 이름이 없습니다. 클래스 인스턴스가 생성 된 후 (후크 - inherited - 호출 된)까지 할당이 일어나지 않기 때문에 이후까지 이름을 얻을 수있는 방법은 없습니다.

+0

네, 그렇습니다.하지만 해킹이있을 수 있습니다. 나는'def self.name;을 정의하려고 시도했다. '비'; end'를 블록에 넣었습니다. 왜냐하면 먼저 이름 클래스 메소드를 정의하고 상속 된 메소드를 호출 할 것이기 때문입니다. 그리고 그 행동은 정말로 이상합니다. –

+0

메소드 정의가있는 블록이 평가되기 전에 위와 같이 후크가 호출되므로 메소드가 아직 존재하지 않기 때문에 작동하지 않습니다. –

1

무엇과 같이 약 :

class Superclass 
    def self.inherited(base) 
    raise 'Invalid class name' unless @forced_anonymous_subclass_name == :A 
    end 
    def self.forced_anonymous_subclass_name 
    @forced_anonymous_subclass_name 
    end 
    def self.with_forced_anonymous_subclass_name(class_name) 
    @forced_anonymous_subclass_name = class_name 
    yield 
    ensure 
    @forced_anonymous_subclass_name = nil 
    end 
end 

sc = Superclass 

sc.with_forced_anonymous_subclass_name(:A) do 
    Object.const_set sc.forced_anonymous_subclass_name, Class.new(sc) 
end #=> A 

sc.with_forced_anonymous_subclass_name(:B) do 
    Object.const_set sc.forced_anonymous_subclass_name, Class.new(sc) 
end #=> RuntimeError 

/개선/등 불분명 물어 주시기 바랍니다.

+0

안녕하세요 @mdesantis, 내가 정말로 해결하고 싶은 것은이 문제입니다. https://github.com/gregbell/active_admin/blob/master/lib/active_admin/namespace.rb#L189 해결책은 작동하지 않지만, ActiveSupport 코드의 어딘가에서'name' 메소드를 검사하기 때문입니다. 그러나 나는 그것이 작동하지 않을 것이라는 것을 확신 할 것입니다 ... 어쩌면 당신은 더 깨끗한 해결책을 알고 있습니까? –

+0

오 ... 그 라인의 문제점은 무엇입니까? 당신이 말하는 이슈는 무엇입니까? 당신이 해결하려고하는 문제를 제게 말하면 우리는 그것에 대해 추론 할 수 있습니다. 'eval'을 대체해야합니까? – mdesantis

+0

맞습니다.'eval'을'Module.new'처럼 더 적절한 것으로 대체하는 법을 모르겠습니다. –

관련 문제