Почему sqrt () не является методом для Numeric? - PullRequest
27 голосов
/ 16 мая 2010

В Ruby все является объектом. Вот почему я не понимаю, почему у нас есть математический модуль. Мне кажется, что большинство (все?) Функций в модуле Math должны быть методами числовых типов, такими как Integer, Float и т. Д.

например. вместо

Math.sqrt(5)

было бы больше смысла иметь

5.sqrt

То же самое относится к sin, cos, tan, log10 и т. Д.

Кто-нибудь знает, почему все эти функции оказались в модуле Math?

Ответы [ 5 ]

23 голосов
/ 16 мая 2010

Я не знаю раннюю историю Ruby, но я чувствую, что модуль Math был смоделирован после заголовка C . Это странная утка в стандартной библиотеке Ruby.

Но это Руби! Так что вы всегда можете уничтожить исправления обезьян!

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
9 голосов
/ 17 мая 2010

Чтобы подробнее остановиться на ответ Михаила , нет необходимости определять все эти методы вручную. Обратите внимание, что я явно пропускаю два метода 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; Майкл, вероятно, на правильном пути с историческим переходом.

7 голосов
/ 08 апреля 2011

Я переписал ответ Марка, чтобы он был более кратким и не требовал удаления hypot и ldexp, поскольку я сам использую этот подход.

class Numeric
  Math.methods(false).each do |method|
    define_method method do |*args|
      Math.send(method, self, *args)
    end
  end
end

>> 3.hypot(4)
=> 5.0

>> Math::PI.sqrt
=> 1.7724538509055159

>> 10.log10
=> 1
3 голосов
/ 17 мая 2010

Говоря о модулях и пространствах имен, Programming Ruby (кирка) привел пример объекта, в котором смешаны как математические функции, так и функции, связанные с моралью, чтобы он мог вычислить , сколько ангелов можетпотанцевать на голове булавкой .Затем он отметил, что без надлежащего пространства имен sin может быть неоднозначным термином.

Так что, возможно, речь идет о загрязнении пространства имен.

2 голосов
/ 09 сентября 2017

5 ** 0.5 демонстрирует, что оператор возведения в степень ruby ​​может напрямую обрабатывать квадратные корни, как для log, sin и т. Д., Они имеют больше смысла для меня как глобальные функции, а не как методы: их происхождение находится в математике и не имеет тесной связи с кем-либо экземпляр с плавающей точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...