Как я могу сравнить классы в Ruby? - PullRequest
1 голос
/ 06 апреля 2011

Как я могу сравнить классы в Ruby или другими словами, как я могу перевести этот Java-код в Ruby?

Class<?> clazz = ...;
if (clazz == String.class) {
  ...
} else if (clazz == Integer.class) {
  ...
}

Чтобы уточнить: я не хочу сравнивать экземпляры объектовили проверьте, является ли объект экземпляром класса.

РЕДАКТИРОВАТЬ: Я не хочу сравнить экземпляры объекта или проверить, является ли объект экземпляромкласс, то есть is_a? и kind_of? мне не помогают.

Ответы [ 3 ]

18 голосов
/ 06 апреля 2011

Перевод буквенного вашего Java-кода будет выглядеть примерно так:

klass = ...

if klass == String
  ...
elsif klass == Integer
  ...
end

Или, более идиоматически

klass = ...

case
when klass == String
  ...
when klass == Integer
  ...
end

Или, может быть

klass = ...

DISPATCH_TABLE = {
  String => -> { ... },
  Integer => -> { ... }
}

DISPATCH_TABLE[klass].()

Однако Ruby является объектно-ориентированным языком, и в объектно-ориентированном языке это просто не имеет смысла. Вместо этого вы просто напишите

class String
  def do_something
    ...
  end
end

class Integer
  def do_something
    ...
  end
end

и язык выполнит диспетчеризацию для вас. Это называется полиморфизм и поддерживается практически всеми объектно-ориентированными языками, а также многими не объектно-ориентированными.

Это конкретное преобразование является одним из фундаментальных рефакторингов, описанных в книге Мартина Фаулера (стр. 255), оно называется Заменить условным полиморфизмом Рефакторинг .

Самая большая проблема с разумным решением вашей проблемы заключается в том, что вы не говорите нам, в чем проблема . Вы только скажете нам, что такое решение . Или, точнее, вы говорите нам, что вы думаете решение в Java , и вы как-то ожидаете, что решение в Ruby будет точно 100% идентичным хотя языки не могут быть более разными.

Чтобы найти хорошее решение, нам нужно сначала узнать проблему. Другими словами: наиболее важными частями вашего вопроса являются s

4 голосов
/ 06 апреля 2011
>> "foo".class == "bar".class
true
3 голосов
/ 06 апреля 2011

В Ruby все объекты классов являются экземплярами класса Class. Имена классов являются константами, которые ссылаются на экземпляр. Если у вас есть ссылка на объект класса, вы можете сравнить ее с именованной константой для этого класса. Так что вы могли бы сделать:

if klass == String
  ...
elsif klass == Integer
  ...
end

Выражение String.class == Integer.class будет истинным, поскольку класс обоих классов, конечно, Class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...