【发布时间】:2017-01-16 20:15:47
【问题描述】:
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
不出所料会产生以下错误:
in 'obtain_color': undefined local variable or method 'my_car' for #<Motorcycle:0x007fc1820690a0 @cc=950> (NameError)
为了解决这个问题,我像这样传入my_car 对象:
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
问题:有没有办法从Motorcycle 的初始化中调用my_car.color 而不必传入my_car 对象?
【问题讨论】:
-
不,你必须传入非类成员的数据。
-
这可以使用 Forwardable 吗?
标签: ruby class object scope initialization