Где лучшее место должно добавить методы к Целочисленному классу в направляющих?

Есть небольшие изменения в HTML. Вы можете сослаться JsFiddle

{{register.regData.branch.chapter_name}}

5
задан Mechanical snail 13 September 2012 в 00:26
поделиться

6 ответов

Если у Вас есть свое сердце при унавоживании с Числовым (или целое число, и т.д.) класс для получения преобразования единицы, то, по крайней мере, делают это логически и с некоторым действительным значением.

Во-первых, создайте класс Единицы, который хранит тип единицы (метры, футы, локтевые кости, и т.д.) и значение на создании. Затем добавьте набор методов к Числовым, которые соответствуют допустимой единице значений, может иметь: эти методы возвратят объект Единицы с, он - тип, зарегистрированный как имя метода. Класс Единицы поддерживал бы набор to_* методов, которые преобразуют в другой тип единицы с соответствующей стоимостью единицы. Тем путем можно сделать следующую команду:

>> x = 47.feet.to_meters
=> 14.3256
>> x.inspect
=> #<Unit 0xb795efb8 @value=14.3256, @type=:meter>

Лучшим способом обработать его, вероятно, была бы матрица типов преобразования и выражений в классе Единицы, затем использовать method_missing, чтобы проверить, может ли данный тип быть преобразован в другой тип. В числовом классе используйте method_missing для выяснения у Единицы, если это поддерживает данный метод как тип единицы, и если так, возвратите объект единицы требуемого типа с помощью числового в качестве его значения. Вы могли затем поддерживать добавляющие единицы и преобразования во времени выполнения путем добавления register_type и register_conversion метода класса для Единицы, которая расширила матрицу преобразования, и Числовой "автоволшебно" возьмет способность.

Что касается того, где поместить его, создайте lib/units.rb файл, который также содержал бы monkey_patch к Числовому, затем инициализировать его в config/environment.rb bu требование lib/units.rb файла.

11
ответ дан 18 December 2019 в 09:11
поделиться

Почему не просто:

class Feet
  def self.in_miles(feet)
    feet/5280
  end
end

использование:

Feet.in_miles 2313

Или, возможно, посмотрите на него другой путь:

class Miles
  def self.from_feet(feet)
    feet/5280
  end
end

Miles.from_feet 2313
2
ответ дан 18 December 2019 в 09:11
поделиться

Создайте свой собственный модуль/библиотеку, который Вы включаете в объем при необходимости в нем для выполнения этой задачи.

Такой как "requre 'unitCoversions'"

И Возможности, кто-то уже сделал это, если Вы выглядите достаточно твердыми :)

Однако не пытайтесь изменить собственный базовый класс, который только закончится в Страдании.

(Кроме того, класс, который Вы хотите расширить, является 'числовым', который будет относиться и к Целым числам и к Плаваниям :))

Не совсем ясный, почему я не должен делать этого... Направляющие делают это к строковому классу к большому успеху.

Поскольку это может быть сделано, не означает, что это должно быть сделано. 'У обезьяны, Исправляющей', как это известно, могут быть все виды нечетных побочных эффектов, и они могут быть эпическим отказом, когда сделано неправильно.

Сделайте это, когда не будет никакой хорошей альтернативы.

Поскольку, если Вы действительно хотели сделать что-то ненормальное, Вы могли бы создать всю платформу, что ВСЕ, что оно сделало, было патчем обезьяны базовые классы.

Просто, например, зеркальное отражение databasing на его голове.

5.getArtist(); 
10.getEvent(); 
100.getTrack(); 

и т.д. и т.д. нет никакого предела тому, сколько плохих путей там состоит в том, чтобы сделать это.

"Bob".createUser(); 

страдание в чашке.

Если Вы хотите сделать что-то практическое, имейте класс Преобразования или функцию,

convert( 3 , { :from=>:miles, :to=>:meters }); 

по крайней мере, Вы не загрязняете глобальное пространство имен и базовые функции тот путь, и это имеет больше когерентного смысла.

2
ответ дан 18 December 2019 в 09:11
поделиться

Я соглашаюсь, что исправление обезьяны должно использоваться с осторожностью, но иногда это просто имеет смысл. Мне действительно нравятся помощники, которые позволяют Вам типу 5.days.ago, которые являются частью active_support библиотеки

Таким образом, некоторые из других ответов могли бы быть лучше в этом случае, но если Вы расширяете рубиновые классы, мы сохраняем все наши расширения в lib/extensions/class_name.rb

этот путь при работе над проектом это быстро и легко найти и видеть что-либо, что могло бы быть необычно со стандартными классами.

2
ответ дан 18 December 2019 в 09:11
поделиться

Обычно (и логически), целые числа не могут быть преобразованы в мили или в метры. Это кажется, что можно хотеть создать новый класс как "Футы" или "дюймы", который инициализируется с целым числом, затем содержит методы как size_in_miles или size_in_meters. Для удобства те методы могли возвратить десятичное число или пустить в ход типы, но Вы могли бы также хотеть записать класс миль или класс метров.

Как альтернативный метод, Вы могли бы хотеть создать статический метод в своем новом классе, который будет иметь подпись как это:

Float feetToMiles(integer I)

то, что Вы звонили бы

miles = Feet.feetToMiles(5280);

и доберитесь miles = 1.0

2
ответ дан 18 December 2019 в 09:11
поделиться

Если бы Вы собирались сделать это, которое Вы не были должны, то Вы поместили бы свой код в:

config/initializers/add_methods_that_are_naughty_to_numeric.rb

Направляющие автоматически выполнили бы их для Вас.

-1
ответ дан 18 December 2019 в 09:11
поделиться
Другие вопросы по тегам:

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