Rails добавляет to_date
метод к String
. Его источник прост:
# File activesupport/lib/active_support/core_ext/string/conversions.rb, line 42
def to_date
return nil if self.blank?
::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
end
Date._parse
является родным для Ruby (тот же метод вызывается Date.parse
), и это , где выполняется настоящая работа .
Сначала оно использует регулярное выражение для удаления посторонних символов из строки, затем передает его другим методам, таким как _parse_eu
, _parse_iso
, _parse_dot
и так далее. Каждый из них использует свои собственные регулярные выражения и другие методы, чтобы увидеть, понимает ли это дату, и извлечь из нее значимую информацию. Как только один из них «работает» (т. Е. Возвращает true), остальные пропускаются. Наконец, в _parse
извлеченная информация используется для построения даты и времени, делая немного больше работы, чтобы выяснить такие вещи, как проверка дня недели и того, должно ли значение года «12» означать 1912 или 2012
В документах это называют эвристическим методом, который можно использовать для обозначения того, что он бросает кучу возможностей в стену, чтобы посмотреть, что прилипает. Это довольно плохо документировано, но работает замечательно хорошо.