Решение 1
Если класс аргумента отличается (String
от File
), то вы можете использовать его в конструкции case
.Вам не нужна дополнительная информация, чтобы различать это.
def upload(arg)
self.content =
case arg
when String; arg
when File; arg.read
end
end
Решение 2
Добавлено после того, как вдохновлено комментарием Nemo157
Используя полиморфизм объектно-ориентированного программирования, вы можете сделать это:
def upload(arg); self.content = arg.upload end
class String
def upload; self end
end
class File
def upload; read end
end
Некоторые заметки о полиморфизме
Часто мы ссылаемся на похожие, но разные действия водно и то же словоНапример, рассмотрим слово add
в контексте обычной жизни: мы используем его в разных значениях: добавляем воду в банку, добавляем 3 к 1, добавляем комментарий, добавляем оттенок синего к зеленой краске и т. Д.,Они имеют разные значения, но у нас есть интуиция, что они как-то связаны.Один из способов различать эти значения будет состоять в том, чтобы использовать разные слова, например, «добавить жидкость», «добавить число», «добавить контекст» или «нумеровать», например, добавить1, добавить2, добавить3, но это беспорядок.Тем не менее, обратите внимание, что их значение в значительной степени зависит от типа объекта, к которому он относится: в зависимости от того, является ли он жидким, числом, дискурсом и т. Д., При этом определяется соответствующий смысл «добавления».Идея полиморфизма использует этот факт и применяет его к программированию.В данном случае «выгрузка» будет иметь разное значение в зависимости от того, идет ли речь о строке или файле.Но пока они определены в их соответствующем классе, вам не нужно заботиться о разнице в их использовании.Следовательно, вы освобождаетесь от оператора case и упрощаете код.