루비에서 꽤 큰 응용 프로그램을 만들었지 만 하나의 거대한 클래스에서 모든 것을 인스턴스 메서드로 사용하는 것은 상당히 조직적이지 않다는 것을 깨달았습니다. 따라서이를 중첩 모듈로 나눠야합니다. 그냥 좀 더 조직적입니다. 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)
: 또한 중첩 된 모듈을 분리 할 수 있습니다'의를 <최고 (필수)> '정의되지 않은 메서드의 앱'# <전화를위한 : 0x007fe9c989c4b0> (NoMethodError)'입니다. 또한 제안 된 두 번째 방법을 사용하는 경우 어떤 클래스에서 초기화 메서드와 모든 인스턴스 변수를 선언합니까? –
당신은 정의되지 않은 메서드 오류로하고있는 것처럼 인스턴스 범위에 include를 호출해서는 안됩니다. 나는 클래스 폰의'end' 바로 전에 include 호출을 옮길 수 있다는 것을 의미했습니다. 초기화에 관해서는 모듈 중 하나에서이를 정의 할 수 있습니다. 이들을 포함 시키면 모든 인스턴스 메소드가 결합됩니다. 그래서'initialization '을 여러 개 정의했다면'super'를 호출하지 않으면 그 중 하나만 실행됩니다. –