2016-09-08 1 views
0
class Car 
    attr_reader :doors, :color 

    def initialize(doors, color) 
    @doors = doors 
    @color = color 
    end 
end 

class Motorcycle 
    attr_reader :cc, :color 

    def initialize(cc) 
    @cc = cc 
    @color = obtain_color 
    end 

    def obtain_color 
    'orange' if my_car.color == 'green' 
    'blue' 
    end 
end 

class Vehicles 
    attr_reader :my_car, :my_motorcycle 

    def initialize 
    @my_car = Car.new(4, 'green') 
    @my_motorcycle = Motorcycle.new(950) 
    end 

    def display_colors 
    puts "my_car color: #{my_car.color}" 
    puts "my_motorcycle color: #{my_motorcycle.color}" 
    end 
end 

my_vehicles = Vehicles.new 
my_vehicles.display_colors 

는 당연히 다음과 같은 오류 발생 :Ruby : 다른 객체의 getter를 사용하여 다른 객체를 초기화하는 방법은 무엇입니까?

class Car 
    attr_reader :doors, :color 

    def initialize(doors, color) 
    @doors = doors 
    @color = color 
    end 
end 

class Motorcycle 
    attr_reader :cc, :color 

    def initialize(cc, my_car) 
    @cc = cc 
    @color = obtain_color(my_car) 
    end 

    def obtain_color(my_car) 
    'orange' if my_car.color == 'green' 
    'blue' 
    end 
end 

class Vehicles 
    attr_reader :my_car, :my_motorcycle 

    def initialize 
    @my_car = Car.new(4, 'green') 
    @my_motorcycle = Motorcycle.new(950, my_car) 
    end 

    def display_colors 
    puts "my_car color: #{my_car.color}" 
    puts "my_motorcycle color: #{my_motorcycle.color}" 
    end 
end 

my_vehicles = Vehicles.new 
my_vehicles.display_colors 

질문 :

in 'obtain_color': undefined local variable or method 'my_car' for #<Motorcycle:0x007fc1820690a0 @cc=950> (NameError)

는이 문제를 해결하기를, 나는이 같은 my_car 객체로 건네 my_car.color를 호출하는 방법이 있나요 의 초기화 내에서 my_car 개체를 전달하지 않아도됩니까?

+0

아니요, 사용자는 클래스의 구성원이 아닌 데이터를 전달해야합니다. – DiegoSalazar

+0

Forwardable? –

답변

2

짧은 대답은 아니오입니다. 오토바이가 자동차의 어떤 인스턴스에 액세스할지 어떻게 알 수 있습니까?

더 긴 대답을 이끌어 낼 수있는 이유는 무엇입니까? 오토바이가 자동차의 색상을 신경 써야하는 이유는 무엇입니까? 대답은 당연히 그럴 필요가 없다는 것입니다.

구체적으로 생각하면 쉽게 Vehicles 클래스의 이름을 Garage으로 변경하십시오. 이제 차고의 인스턴스가 두 개있는 경우 : my_garageyour_garage 아마도 같은 "색상 규칙"이 각 인스턴스에 적용되지만 하나의 인스턴스는 다른 인스턴스에 아무런 영향을 미치지 않습니다. 차고에 초록색 자동차가있는 경우, 내 차고에 초록색 자동차가 없으면 오렌지색 오토바이를 사용할 수 없습니다.

오토바이는 자동차가 어떤 색상 (또는 자동차가 있더라도)을 신경 쓰지 않아야하므로 어떻게 오토바이의 색상을 자동차의 색상에 따라 좌우할 수 있습니까?

class Motorcycle 
    attr_reader :cc, :color 

    def initialize(cc, color) 
    @cc = cc 
    @color = color 
    end 
end 

class Garage 
    attr_reader :my_car, :my_motorcycle 

    def initialize 
    @my_car = make_car 
    @my_motorcycle = make_motorcycle 
    end 

    def make_car 
    Car.new(4, "green") 
    end 

    def make_motorcycle 
    if @my_car && @my_car.color == "green" 
     color = "orange" 
    else 
     color = "blue" 
    end 

    Motorcycle.new(950, color) 
    end 

    def display_colors 
    puts "my_car color: #{my_car.color}" 
    puts "my_motorcycle color: #{my_motorcycle.color}" 
    end 
end 

이 자동차의 색상이 make_car에 하드 코딩되어 있기 때문에 조금 인위적인, 그래서 우리는 단지 하드 코딩 오토바이의 색상 수, 너무,하지만 당신은 아이디어를 얻을 : 우리는 주차장에 맡긴다.

개체가 이와 같이 상호 연관 될 때 논리를 넣으려고하면 은 실제로입니다. 너는 그걸 잘 해낼거야. 그러나 머리를 긁적 거리고 싶지 않으면 내가 Sandi Metz' Practical Object-Oriented Design in Ruby을 추천한다. 지금까지 작성된 최고의 루비 도서 중 하나가 아니며, 지금까지 작성된 최고의 OOP 도서 중 하나입니다.

P. 여기, 당신의 코드에서 버그를했다 :이 방법은 항상 "blue"를 반환합니다

def obtain_color(my_car) 
    'orange' if my_car.color == 'green' 
    'blue' 
end 

. 아마도 다음과 같은 의미 일 겁니다.

def obtain_color(my_car) 
    return 'orange' if my_car.color == 'green' 
    'blue' 
end 
+0

'오토바이는 자동차가 어떤 색인지 신경 쓰지 않아야한다. (자동차가 존재하는 경우에도)'는 OOP의 핵심 개념 인 것으로 보인다. 나는 책을 조사 할 것이다! –

1

Vehicle 클래스의 오토바이 색상을 설정하지 않는 이유는 무엇입니까?

다른 인스턴스에서 (attr_accessor를 사용하여) 색상 인스턴스 변수에 액세스 할 수있게 만든 다음 Vehicle 클래스 내에서 색상을 설정하는 메소드를 추가하기 만하면됩니다.

class Car 
    attr_reader :doors, :color 

    def initialize(doors, color) 
    @doors = doors 
    @color = color 
    end 
end 

class Motorcycle 
    attr_reader :cc 
    attr_accessor :color 

    def initialize(cc) 
    @cc = cc 
    @color = nil 
    end 
end 

class Vehicles 
    attr_reader :my_car, :my_motorcycle 

    def initialize 
    @my_car = Car.new(4, 'green') 
    @my_motorcycle = Motorcycle.new(950) 
    set_motocycle_color 
    end 

    def set_motocycle_color 
    my_motorcycle.color = (my_car.color == 'green') ? 'blue': 'orange' 
    end 

    def display_colors 
    puts "my_car color: #{my_car.color}" 
    puts "my_motorcycle color: #{my_motorcycle.color}" 
    end 
end 

my_vehicles = Vehicles.new 
my_vehicles.display_colors 

# my_car color: green 
# my_motorcycle color: blue 
관련 문제