метод с тем же именем и разными параметрами в Ruby - PullRequest
15 голосов
/ 10 июля 2009

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

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

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

Ответы [ 3 ]

34 голосов
/ 10 июля 2009

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

Эта страница содержит более подробную информацию и способ ее обхода. По сути, вы создаете один метод с переменным числом параметров и соответственно обрабатываете их.

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

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

2 голосов
/ 10 июля 2009

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

#!/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
0 голосов
/ 10 июля 2009

Используйте 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 и рыскание контекст.

...