Лично я создал бы пользовательское Time
struct
, который содержит DateTime
экземпляр, и который имеет подобные свойства, конструкторы и т.д., но не представляет дни/месяцы/и т.д. Просто сделайте всю свою общедоступную передачу средств доступа до содержавшего экземпляра. Тогда у Вас может просто быть эпоха как private static readonly DateTime
поле, и не имеет значения, что оценивает Вас, выбирают, поскольку это все аккуратно содержится в Вашей пользовательской структуре. В остальной части Вашего кода может просто записать:
var time = new Time(16, 47, 58);
Ruby на самом деле не поддерживает перегрузку.
Эта страница дает более подробную информацию и обходной путь. По сути, вы создаете один метод с переменным числом параметров и обрабатываете их соответствующим образом.
(Я лично рекомендовал бы написать один метод для распознавания двух разных «ложных перегрузок», а затем по одному методу для каждой перегрузки с разными имена, отражающие различные параметры.)
В качестве альтернативы, просто укажите другие имена для начала:)
Just for comparison, here's how I would solve it:
#!/usr/bin/env ruby
class Command2D
def initialize(x, y, yaw)
@command = [x, y, yaw]
end
end
class Vehicle
def velocity=(command_or_array)
case command_or_array
when Command2D
self.velocity_from_command = command_or_array
when Array
self.velocity_from_array = command_or_array
else
raise TypeError, 'Velocity can only be a Command2D or an Array of [x, y, yaw]'
end
end
private
def velocity_from_command=(command)
@velocity = command
end
def velocity_from_array=(ary)
raise TypeError, 'Velocity must be an Array of [x, y, yaw]' unless ary.length == 3
@velocity = Command2D.new(*ary)
end
end
v1 = Vehicle.new
v1.velocity = Command2D.new(1, 2, 3)
v2 = Vehicle.new
v2.velocity = [1, 2, 3]
p v1
p v2
Используйте attr_accessor для добавления атрибутов, и вы автоматически получите геттеры и сеттеры. В качестве альтернативы используйте attr_reader или attr_writer , чтобы получить атрибуты только для чтения или только для записи.
class Foo
attr_accessor :velocity
end
Теперь вы можете установить и получить значение этого атрибута следующим образом:
foo = Foo.new
foo.velocity = 100
puts foo.velocity # => 100
Если вы хотите добавить методы для установки атрибута на основе некоторых параметров, используйте имя, отражающее, какой тип ввода ожидается:
def velocity_from_yaw(x, y, yaw)
velocity = Command2d.new(x, y, yaw)
end
Вы, вероятно, можете найти гораздо лучшее имя в этом случае, но я не знаю, какое у вас x , y и рыскание действительно означают в вашем контексте.