문제

여기에서 상속으로 무슨 일이 일어나고 있는지 모르겠습니다.이 코드에 대해 nil 값을 얻습니다.그러나 온도 클래스가 허용하는 것과 같이 INITIALISE 메소드를 무시하고 해시 인수를 통과 할 때 (: C=> 50) 그것은 잘 작동합니다.

공장 메소드가 이제는 이제 변경되는 초기화 방법을 다시 호출 할 수 있습니다.그러나 그때 나는 루프를 얻는 것으로 생각했을 것입니다 ..

고맙습니다.아래는 코드 세그먼트입니다.R-Spec 교육 자원

에 대한 솔루션입니다.

나는 내 질문이 있다고 생각한다 :

Self.From_celsius 메소드가 온도에서 정의 된 초기화 방법으로 변환 방법을 호출하지 않는 새 인스턴스 객체를 생성하는 이유는 무엇입니까?

class Temperature

    ######################## -- getter methods 
    def in_fahrenheit 
        @in_fahrenheit
    end 

    def in_celsius
        @in_celsius
    end

    ######################## -- initialize and call the calculations
    def initialize(hash)
        @options = hash
        conversion
    end

    ######################## -- calculations
    def conversion
        @options.key?(:c) ? @in_fahrenheit = (9.0/5.0*@options[:c].to_f) + 32.0 : @in_fahrenheit = @options[:f]
        @options.key?(:f) ? @in_celsius = (5.0/9.0)*(@options[:f].to_f - 32.0) : @in_celsius = @options[:c]
    end 

    ######################## -- factory methods
    def self.from_celsius(c)
        self.new(:c => c)
    end

    def self.from_fahrenheit(f)
        self.new(:f => f)
    end
end


class Celsius < Temperature
    def initialize(c)
        Temperature.from_celsius(c)
    end
end

class Fahrenheit < Temperature
    def initialize(f)
        Temperature.from_fahrenheit(f)
    end
end


x = Celsius.new(50).in_celsius

puts x.nil?
#=> true
.

도움이 되었습니까?

해결책

이것은 원하는 방식으로 작동합니다 :

class Celsius < Temperature
    def initialize(c)
        super(c: c)
    end
end

class Fahrenheit < Temperature
    def initialize(f)
      super(f: f)
    end
end
.

상속을 잘 사용하는 것이 아니라는 것이 명심해야합니다.

코드가 작동하지 않는 이유는 초기화 프로그램이 새로 생성 된 객체를 반환하지 않아도됩니다.새 호출은 개체를 만듭니다. 이니셜 라이저는 단지 초기화하는 것입니다.또한 attr_accessor를 사용하여 Getter 코드를 정리해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top