В Ruby все - объект. Вот почему я не понимаю, почему у нас есть Математический модуль. Мне что большинство кажется (все?) функций в Математике модуль должен был быть методами на числовых типах как Целое число, Плавание и так далее.
Например, вместо
Math.sqrt(5)
имело бы больше смысла иметь
5.sqrt
То же идет для sin
, cos
, tan
, log10
и так далее.
Кто-либо знает, почему все эти функции закончились в Математическом модуле?
Я не знаю ранней истории Ruby, но мне кажется, что модуль Math был смоделирован по образцу заголовка C
Но это же Руби! Так что вы всегда можете избавиться от патчей обезьяны!
class Float
def sqrt; Math.sqrt(self); end
def sin; Math.sin(self); end
def cos; Math.cos(self); end
def tan; Math.tan(self); end
def log10; Math.log10(self); end
end
Говоря о модулях и пространствах имен, Programming Ruby (кирка) привел пример объекта со смешанными математическими функциями и функциями, связанными с моралью. смешанные так, чтобы он мог вычислить , сколько ангелов могут танцевать на булавочной головке . Затем он отметил, что без надлежащего пространства между именами sin
может быть неоднозначным термином.
Так что, возможно, дело в загрязнении пространства имен.
Чтобы расширить ответ Майкла , нет необходимости определять все эти методы вручную. Обратите внимание, что я явно пропускаю два метода Math, которые принимают два аргумента.
class Numeric
(Math.methods - Module.methods - ["hypot", "ldexp"]).each do |method|
define_method method do
Math.send method, self
end
end
end
puts 25.sqrt
puts 100.log10
Вывод:
5.0
2.0
Что касается того, почему эти методы уже не включены в Numeric
, я действительно не уверен в уважительной причине. Я не думаю, что загрязнение пространства имен, как упомянул Эндрю , представляет особый риск для класса Numeric
; Майкл, вероятно, на правильном пути с историческими последствиями.