В Ruby там любые связанные приложения синтаксиса: класс <<сам … конец

Из любопытства, откуда вы берете эти данные? Из формы? В таком случае; Я просто попросил бы пользователя заполнить (или каким-либо образом выбрать) год четырьмя цифрами или получить возраст пользователя и месяц / день рождения, и использовать эти данные, чтобы выяснить, в каком году они родились. Таким образом, вам не придется беспокоиться об этой проблеме вообще:)

Редактировать: Использовать DateTime для работы с данными такого типа.

11
задан Jon Seigel 16 April 2010 в 20:28
поделиться

3 ответа

в 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 Ясно вижу метаклассы

19
ответ дан 3 December 2019 в 05:13
поделиться

Думайте о классе как о содержащем словарь членов, включая все методы доступа и переменные экземпляра. Когда вы говорите классу «добавить» к «самому себе», вы говорите «добавить их в словарь членов класса».

Я согласен, что это обозначение немного странно.

2
ответ дан 3 December 2019 в 05:13
поделиться

на самом деле сложно думать об этом в терминах оператора "добавления". лучше взглянуть на это так: так же, как 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
1
ответ дан 3 December 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: