Переопределение вывода диапазона по умолчанию - PullRequest
1 голос
/ 04 марта 2011

Прямо сейчас код ниже производит вывод ниже этого, но как бы я переопределил вывод по умолчанию на более логичный для моей данной ситуации.Я понимаю, что мог бы просто добавить строку "Hz" после диапазона, но я хочу включить ее в модуль, который может быть включен в класс Range при необходимости или для использования с уточнениями .

Код:

("20Hz"..."40Hz").each { |hz| p hz }     

Выход:

"20Hz"
"20Ia"
"20Ib"
...etc

Требуемый выход:

"20Hz"
"21Hz"
"22Hz"
...etc

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Я бы порекомендовал создать для этого собственную функцию или класс, а не менять поведение диапазонов Ruby. Вероятно, существует много другого кода, который зависит от диапазонов, работающих определенным образом, и изменение определения диапазона приведет к нарушению этого кода. Вы можете стремиться к чему-то вроде этого:

HzRange.new("20Hz", "40Hz").each{ |hz| p hz }

Создание класса HzRange зависит от вас, но вам, вероятно, следует делегировать объект Array или Range, чтобы можно было унаследовать некоторое поведение по умолчанию, например Enumerable.

1 голос
/ 04 марта 2011

Это абсолютно плохая идея, но только для экспериментов:

class String
  alias_method :succ_orig, :succ

  def succ
    self.gsub(/\d+/, &:succ_orig)
  end
end

p ("20Hz".."40Hz").to_a
#=> ["20Hz", "21Hz", "22Hz", "23Hz", "24Hz", "25Hz", "26Hz", "27Hz", "28Hz", "29Hz", "30Hz", "31Hz", "32Hz", "33Hz", "34Hz", "35Hz", "36Hz", "37Hz", "38Hz", "39Hz", "40Hz"]

Как видите, следует изменить не класс Range, а метод String#succ.

Но в реальном проекте вам лучше создать класс для ваших строк Герца и соответствующим образом определить его метод succ.

1 голос
/ 04 марта 2011

Я думаю, это довольно просто.

  ("20"..."40").each { |hz| p hz + 'Hz'}
...