2017-01-22 1 views
0

루비에서 꽤 큰 응용 프로그램을 만들었지 만 하나의 거대한 클래스에서 모든 것을 인스턴스 메서드로 사용하는 것은 상당히 조직적이지 않다는 것을 깨달았습니다. 따라서이를 중첩 모듈로 나눠야합니다. 그냥 좀 더 조직적입니다. StackOverflow를 검색했지만 사실 클래스에 중첩 된 모듈을 사용하는 것이 일반적이지 않습니다. 나는 실행하기 위해 노력하고있어 다음클래스 내에서 중첩 된 루비 모듈

class Phones 

    include Apps 
    include Call 

    attr_accessor :brand, :model, :price, :smartphone 
    def initialize(brand,model,price,smartphone=true) 
    @price = price 
    @brand = brand 
    @model = model 
    @smartphone = smartphone 
    @task = 'stand-by' 
    end 

    module Apps 
    public def camera 
     @task = __method__.to_s 
     puts "Took a picture!" 
     self 
    end 
    public def gallery 
     @task = __method__.to_s 
     puts "Photos!" 
     self 
    end 
    end 

    module Call 
    public def scall 
     @task = __method__.to_s 
     puts "Ring ring!" 
     self 
    end 
    end 

end 

:

s7 = Phones.new('Samsung','S7 Edge',3000).Apps.camera 

을하지만이 오류가 계속 나는 간단한 예를 들어 클래스를 사용하여 모듈이 작동하는 방법 중첩 된 이해하려고 노력 중이 야

:

...phones.rb:3:in `<class:Phones>': uninitialized constant Phones::Apps (NameError) 

답변

0

문제는 귀하의 include 전화가 실제 모듈 앞에 있습니다. itions.

클래스 정의를 작성하면 메소드 정의와 같은 항목을 제외하고 클래스 정의가 모두 즉시 실행됩니다. 예를 들어 :

class Foo 
    puts 1 + 1 
end 

Foo.new 말할 때까지 기다리지 않습니다, 즉시이 인쇄됩니다.

해결 방법 중 하나는 include 호출을 클래스 정의의 끝으로 이동하거나 모듈을 맨 위로 이동하는 것입니다. phones.rb : 38 : 오류가 있습니다 하단에 포함 통화를 이동

class Phones 
    module Apps 
    # your stuff here 
    end 
end 

class Phones 
    module Call 
    # stuff 
    end 
end 

# just make sure the previous modules have been defined 
# by the time this code is run 
class Phones 
    include Call 
    include Apps 
end 
+0

: 또한 중첩 된 모듈을 분리 할 수 ​​있습니다'의를 <최고 (필수)> '정의되지 않은 메서드의 앱'# <전화를위한 : 0x007fe9c989c4b0> (NoMethodError)'입니다. 또한 제안 된 두 번째 방법을 사용하는 경우 어떤 클래스에서 초기화 메서드와 모든 인스턴스 변수를 선언합니까? –

+0

당신은 정의되지 않은 메서드 오류로하고있는 것처럼 인스턴스 범위에 include를 호출해서는 안됩니다. 나는 클래스 폰의'end' 바로 전에 include 호출을 옮길 수 있다는 것을 의미했습니다. 초기화에 관해서는 모듈 중 하나에서이를 정의 할 수 있습니다. 이들을 포함 시키면 모든 인스턴스 메소드가 결합됩니다. 그래서'initialization '을 여러 개 정의했다면'super'를 호출하지 않으면 그 중 하나만 실행됩니다. –

관련 문제