2013-04-30 4 views
2

개요 : 그래서 (그러나 어쩌면 DSL이 더 나은 것?)처럼루비 : 파일에서 객체를 생성

main.rb 
items/ 
    one.rb 
    two.rb 
    three.rb 

items/의 모든 파일 (직렬화가 발생한 경우) 인간이 읽을 수있는 설명이 있어야합니다

class One < BaseItem 
    name "Item one" 
    def meth 
     "something" 
    end 

main.rbitems/ 디렉토리의 모든 개체를 인스턴스화 할 수 있어야합니다. 이것이 어떻게 성취 될 수 있습니까? 루비에 익숙하지 않지만 객체 모델이 멋진 클래스 (클래스 훅 등)를 허용한다는 것을 알았지 만이를 해결하는 방법을 찾는 데 어려움을 겪고 있습니다.

모든 입력 방법이 좋습니다.

편집 :

촬영, 나는 그것의 요점을 놓친 - 동적 것이다 items/ 디렉토리에있는 물건이었다 내가 무엇을 언급하지 않았다 - 플러그인과 같은 항목을 취급, 나는 자동 감지하는 main.rb을 싶어 런타임시 해당 dir의 모든 것 (실행 중에 다시로드 할 수 있음). main.rb에는 거기에있는 객체에 대한 사전 지식이 없으므로 객체에서 기대할 수있는 방법을 알고 있습니다.

나는 (main.rb에서) 블록을 취하는 spawn 함수를 정의하는 것을 고려하여 DSL을 만들려고했다. 기본 형식의 새로운 객체를 생성하고 instance_eval에 블록을 전달할 것

spawn do 
    name "Item name" 
    def foo 
     "!" 
    end 
end 

그리고 spawn의 내장 : items/에서 샘플 파일과 같을 것입니다. 즉, 값을 설정하려면 name 메서드가 있어야하지만 부수적으로 값을 name 아래에서 액세스 할 수 있기를 바랬 기 때문에 attr의 이름을 변경해야했습니다.

또한 상속 경로를 시도했습니다. 모든 항목 파일에 BaseItem에서 상속하는 클래스가 포함되어 있고 inherited을 통해 연결됩니다.하지만 작동하지 않았습니다. 후크가 실행되지 않았으므로 지금 코드를 잃어 버렸습니다.)

EDIT2 :

당신은, 즉 내가 원하는 것 무엇에 가까운 무엇 homebrew이 수식 수행 볼 수 있었다 - 난 그냥 수식을 처리하는 방법을 리버스 엔지니어링 할 수있는 루비 솜씨를 가지고 있지 않았다.

+3

당신은이 문제를 해결하는 연구가 무엇을 이끌 었는지, 그리고 왜 그러한 것들이 당신을 위해 실패했는지 말하지 않습니다. 우리에게 말해주세요, 그래서 우리는 20 개의 질문을 끝내지 못합니다. –

답변

2

모든 파일이 필요하므로 원하는 기능을 구현했는지 확인하십시오.

보다 구체적인 응답을 원하면보다 구체적인 질문을해야합니다.

0

나는 개체 지속성에 대한 전문가가 아니지만 특정 질문에 대한 대답은 YAML과 Ruby 자체가 좋은 선택이라는 것입니다. 귀하 또는 다른 누군가가 작성한 DSL이며 비즈니스 로직.

하지만 좀 더 일반적인 대답은 루비에서 객체 지속성을보다 체계적으로 검토해야한다고 생각합니다. 예를 들어 ActiveRecord :: Base 자손은 데이터베이스 테이블로 유지됩니다. 다른 방법이 있습니다. 예를 들어 발견했습니다. 이 http://stone.rubyforge.org/으로 검색합니다. 이것은 나의 문제이기도하다. 나는 당신과 똑같은 질문에 직면하고있다.

+0

속성이 아니라 메소드가 필요하기 때문에 YAML을 사용할 수 없습니다. YAML에 관한 것이 아니라면 모르겠습니다. – maligree

+0

@maligree : 메서드 이름과 간단한 인수 일 경우 YAML에서 처리 할 수 ​​있습니다. 파일에 메서드 본문을 지정해야하는 경우 DSL보다 깁니다. –

+0

네, 시체가있는 방법입니다. 그러나 실제로 YAML이 IDL이라는 아이디어를 좋아합니다. 감사합니다. 어쩌면 언젠가 .. – maligree

0

일반적인 루비 스크립트와 많이 비슷한 모양과 냄새가납니다.

class One < BaseItem 
    name "Item one" 
    def meth 
     "something" 
    end 

end 문으로 클래스 정의를 닫습니다. name "Item one" 아마 인스턴스 변수 설정하여 initialize 방법 내부에서 수행 될 것이다 :

attr_reader :name 
def initialize(name) 
    @name = name 
end 

은 일반적으로 우리가 폴더 "항목을"전화하지,하지만 대신은 "lib에"이 될 것입니다,하지만 그렇지 않으면 당신이 무슨 말을 대략은 정상적이고 예상된다.

폴더의 모든 항목을 인스턴스화하는 것은 폴더 내용을 반복하고 파일을 필요로하며 해당 항목에 new 메서드를 호출하여 쉽게 수행 할 수 있습니다.

one = One.new("item one") 

당신은 배열이나 해시, 또는 단지를로드 항목을 추적 할 수 있습니다 : 당신은, 또는 파일의 끝에 인스턴스를 초기화하여 클래스 이름을 파일 이름을 매핑하여 이름을 알아낼 수 당신의 코드이기 때문에 당신에게 달려 있습니다.

Ruby 스크립트를 작성하지 않은 것 같습니다. 그렇지 않으면 이미 발견했을 것입니다. 일반적인 루비 프로그래밍 서적/문서는이를 다루었을 것입니다. 그렇기 때문에 문제는 조숙 한 최적화와 비슷하며 언어로 작업하면 답이 나옵니다.