Мой был бы этим в c# 3.0:)
var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => type.IsAssignableFrom(p));
В основном, наименьшее количество объема повторений всегда будет:
loop assemblies
loop types
see if implemented.
Это решение, которое в итоге работало так, как я хотел:
class Float
alias_method(:original_to_s, :to_s) unless method_defined?(:original_to_s)
def is_whole?
self % 1 == 0
end
def to_s
self.is_whole? ? self.to_i.to_s : self.original_to_s
end
end
Таким образом я могу обновить логику is_whole?
(мне кажется, что tadman - это наиболее изощренный), если необходимо, и гарантирует, что где бы то ни было, вывод Float в строку (например, в форме) будет выглядеть так, как я хочу (то есть без нулей на конце).
Спасибо всем за вашу идеи - они действительно помогли.
Один простой способ:
class Float
def prettify
to_i == self ? to_i : self
end
end
Это потому, что:
irb> 1.0 == 1
=> true
irb> 1 == 1.0
=> true
Тогда вы могли бы сделать:
irb> 1.0.prettify
=> 1
irb> 1.5.prettify
=> 1.5
Я мало что знаю о Ruby.
Но это проблема display . Я был бы очень удивлен, если бы в используемых вами библиотеках не было возможности форматировать число при преобразовании его в строку.
Может не быть универсальной опции форматирования, которая делает именно то, что вы хотите, но вы может настроить метод, который возвращает true, если float является представлением целого числа с плавающей запятой, и false в противном случае. Внутри создаваемой вами процедуры форматирования (так что вам нужно сделать это только один раз) просто измените форматирование в зависимости от того, истинно это или нет.
В этом обсуждается, как контролировать количество цифр, которые появляются после десятичная дробь при отображении числа.
Остерегайтесь хитросплетений представлений с плавающей запятой. Математика может сказать, что ответ - 3, но вы можете получить 3000000000000000000001. Я бы предложил использовать дельту, чтобы увидеть, является ли число почти целым.
Математика может сказать, что ответ - 3, но вы можете получить 3000000000000000000001. Я бы предложил использовать дельту, чтобы увидеть, является ли число почти целым. Математика может сказать, что ответ - 3, но вы можете получить 3000000000000000000001. Я бы предложил использовать дельту, чтобы увидеть, является ли число почти целым.Я тоже мало что знаю о Ruby.
Но в C ++ я бы сделал следующее:
bool IsWholeNumber( float f )
{
const float delta = 0.0001;
int i = (int) f;
return (f - (float)i) < delta;
}
И затем я бы отформатировал точность вывода на основе этого.
Вот моя ужасно хактастическая реализация, предоставленная в образовательных целях:
class Float
def to_int_if_whole(precision = 2)
("%.#{precision}f" % self).split(/\./).last == '0' * precision and self.to_i or self
end
end
puts 1.0.to_int_if_whole # => 1
puts 2.5.to_int_if_whole # => 2.5
puts 1.9999999999999999999923.to_int_if_whole # => 2
Причина использования стиля sprintf Вызов заключается в том, что он обрабатывает приближения с плавающей запятой гораздо надежнее, чем метод Float # round.
Хотя я склонен согласиться с указанным выше сообщением, если вам необходимо это сделать:
(float == float.floor) ? float.to_i : float