Подтвердить что ты не робот

Метод с таким же именем и разными параметрами в Ruby

У меня есть этот код:

def setVelocity (x, y, yaw)
  setVelocity (Command2d.new(x,y,yaw))
end
def setVelocity (vel)
......
end 

vel - это класс Command2D, который имеет 3 атрибута, является Comparable и определяет +, в основном это удобный класс для управления этими 3 атрибутами, поэтому я хочу использовать его внутри своей библиотеки (не хочу делать их частными, либо дать им странные имена). Но Ruby, похоже, сохраняет только последнюю setVelocity, даже когда количество параметров отличается. поэтому, когда я вызываю setVelocity с 3 параметрами, скажу, что мне нужно вызвать этот метод только с одним параметром.

4b9b3361

Ответ 1

Ruby не поддерживает перегрузку.

Эта страница дает более подробную информацию и обходной путь. В основном вы создаете единый метод с переменным числом параметров и соответствующим образом обрабатываете их.

(Я лично рекомендовал бы написать один метод для распознавания двух разных "фальшивых перегрузок", а затем один метод для каждой перегрузки с разными именами, отражающими разные параметры.)

В качестве альтернативы просто укажите разные имена, чтобы начать с:)

Ответ 2

Просто для сравнения, вот как бы я решил:

#!/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

Ответ 3

Используйте attr_accessor, чтобы добавить атрибуты, и вы автоматически получите getters и seters. В качестве альтернативы используйте 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 действительно означают в вашем контексте.