метод с одинаковым именем и разными параметрами в Ruby
У меня есть этот код:
def setVelocity (x, y, yaw)
setVelocity (Command2d.new(x,y,yaw))
end
def setVelocity (vel)
......
end
vel-это класс Command2D, который имеет 3 атрибута, сопоставим и определяет+, в основном это удобный класс для меня, чтобы управлять этими 3 атрибутами, поэтому я хочу использовать его внутренне в своей библиотеке (не хочу делать их частными, либо давать им странные имена). Но Ruby, похоже, сохраняет только последнюю setVelocity, даже если количество параметров отличается. поэтому, когда я вызываю setVelocity с 3 параметрами, скажу, что мне нужно вызвать этот метод только с одним параметром.
3 ответов
Ruby не поддерживает перегрузку.
на этой странице дает более подробную информацию и обходной путь. В основном вы создаете один метод с переменным числом параметров и имеете дело с ними соответствующим образом.
(Я лично рекомендовал бы написать один метод для распознавания двух разных "поддельных перегрузок", а затем один метод для каждой перегрузки с разными именами, отражающими разные параметры.)
кроме того, просто предоставить различные имена, чтобы начать с:)
просто для сравнения, вот как я бы решить это:
#!/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 и yaw действительно означает в вашем контексте.