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

Лично я создал бы пользовательское Time struct, который содержит DateTime экземпляр, и который имеет подобные свойства, конструкторы и т.д., но не представляет дни/месяцы/и т.д. Просто сделайте всю свою общедоступную передачу средств доступа до содержавшего экземпляра. Тогда у Вас может просто быть эпоха как private static readonly DateTime поле, и не имеет значения, что оценивает Вас, выбирают, поскольку это все аккуратно содержится в Вашей пользовательской структуре. В остальной части Вашего кода может просто записать:

var time = new Time(16, 47, 58);
19
задан Lars Haugseth 10 July 2009 в 10:19
поделиться

3 ответа

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

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

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

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

37
ответ дан 30 November 2019 в 03:25
поделиться

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
2
ответ дан 30 November 2019 в 03:25
поделиться

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

0
ответ дан 30 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: