На вопрос, почему проектное решение было принято так, что бесконечность нарушает симметрию:
Float::INFINITY.to_s.to_f # => 0.0
Причина в том, что это единственный способ иметь согласованность. Обещание, которое #to_f
дает вам, заключается в том, что он будет интерпретировать число с плавающей запятой литерал в (в начале) строки.
Infinity
не является буквальный . Если вы попытаетесь оценить его, вы получите:
NameError
: неинициализированная константа Infinity
Float::INFINITY
не является литералом либо. Это константа INFINITY
, вложенная в Float
.
Почему тогда это должны быть только литералы? Ну ... я могу заставить #to_s
вернуть все что угодно:
class Float
def to_s
'foo'
end
end
42.0.to_s # => 'foo'
Очевидно, что и 1032 *, и невозможно разумно ожидать 42.0
.
Мы можем сделать Float::INFINITY.to_s
верните другие вещи. Строка 'Infinity'
не является чем-то особенным. Это не число с плавающей точкой литерал как -1.23
или 9.999999999999995e+39
.
Вы можете посмотреть на это с противоположной стороны - большинство операций с плавающей запятой, когда #to_s
-эд, возвращают строку, представляющую их буквальная форма. Это просто счастливое совпадение, что вам также нужно #to_f
вернуть их. Float::INFINITY
не возвращает строковую версию формы literal , поскольку она не имеет формы literal .
Вот и все. Хотя я думаю, что была упущена прекрасная возможность сделать ∞
«литералом бесконечности», они, вероятно, избавили себя от головной боли, не добавив символ юникода в качестве требования иметь полную грамматику языка.
Может Вы думаете о каком-либо языке программирования, который имеет буквальный синтаксис для бесконечности?