Из любопытства, откуда вы берете эти данные? Из формы? В таком случае; Я просто попросил бы пользователя заполнить (или каким-либо образом выбрать) год четырьмя цифрами или получить возраст пользователя и месяц / день рождения, и использовать эти данные, чтобы выяснить, в каком году они родились. Таким образом, вам не придется беспокоиться об этой проблеме вообще:)
Редактировать: Использовать DateTime для работы с данными такого типа.
в Ruby вы можете повторно открывать существующие классы и добавлять методы. То есть вы можете сказать:
class Foo
def bob
return "hello from bob"
end
end
эти методы хранятся где-то во внутреннем словаре (возможно, в переменной экземпляра) класса Foo
(который является всего лишь экземпляром класса
] -class и, следовательно, имеет переменных экземпляра)
Но удивительно то, что вы также можете добавлять методы к экземплярам существующих объектов
foo = Foo.new
foo2 = Foo.new
def foo.fred
return "I am fred"
end
foo.fred #=> "I am fred"
foo2.fred #=> NoMethodError
, но Где этот метод фактически хранит ?
. Оказывается, Ruby создает новый класс за кулисами (иногда называемый singleton class , metaclass или eigenclass ), который вставляется в иерархию наследования между классом Foo
и его экземпляром.
Таким образом, отношение наследования выглядит так:
foo < (eigenclass of foo) < Foo < Class
(если вы скажете foo.superclass, вы не увидите одноэлементный класс)
class << X
-синтаксис - это способ получить в этот специальный класс, чтобы вы могли напрямую управлять им. Следующие блоки кода полностью эквивалентны:
def foo.bar
return "xy"
end
# is exactly the same as
class << foo
def bar
return "xy"
end
end
Таким образом, сходство между class Foo
class << Foo
не случайно, в обоих происходит наследование.
Думайте о class << X
как о «открытии метакласса X»
В Ruby нужно помнить, что классы сами по себе являются просто объектами. (Экземпляры класса Class
), поэтому, если вы скажете:
class Foo
class << self
def k
return "x"
end
end
end
( self
привязан к Foo
в этом блоке кода), поэтому k
является методом экземпляра собственного класса ] Foo
, что делает его методом класса для Foo
. Все это более подробно объясняется в главе о классах Кирки (веб-версия не содержит диаграмм, к сожалению) и _whys Ясно вижу метаклассы
Думайте о классе как о содержащем словарь членов, включая все методы доступа и переменные экземпляра. Когда вы говорите классу «добавить» к «самому себе», вы говорите «добавить их в словарь членов класса».
Я согласен, что это обозначение немного странно.
на самом деле сложно думать об этом в терминах оператора "добавления". лучше взглянуть на это так: так же, как class Foo
открывает класс Foo, то есть он устанавливает self для объекта класса Foo, создавая его, если необходимо, поэтому class << self
открывает собственный класс текущего объекта self. обратите внимание, что это не ограничивается self - для любой панели объектов вы можете сказать class << bar, чтобы открыть собственный класс этого объекта.
class A
def hello
print "hello world"
end
end
a = A.new
b = A.new
class << a
def goodbye
print "goodbye cruel world"
end
end
a.hello
b.hello
a.goodbye
b.goodbye