Почему является sqrt () не методом на Числовом?

В Ruby все - объект. Вот почему я не понимаю, почему у нас есть Математический модуль. Мне что большинство кажется (все?) функций в Математике модуль должен был быть методами на числовых типах как Целое число, Плавание и так далее.

Например, вместо

Math.sqrt(5)

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

5.sqrt

То же идет для sin, cos, tan, log10 и так далее.

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

28
задан KaptajnKold 17 May 2010 в 19:19
поделиться

3 ответа

Я не знаю ранней истории 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
23
ответ дан 28 November 2019 в 03:24
поделиться

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

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

3
ответ дан 28 November 2019 в 03:24
поделиться

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

9
ответ дан 28 November 2019 в 03:24
поделиться