Я хотел использовать value.respond_to?(:dup) ? value.dup : value, чтобы проверить, могу ли я дублировать объект, но он не удался с TypeError на booleans, nil или таких "примитивах".
Я закончил с:
begin
value = value.dup
rescue
#ignore, use the original if no dup-able (e.g nil, true, etc)
end
Есть ли лучший способ?
Бонус: почему он отвечает :dup?
Не глубоко dup, просто для вопроса.
EDIT: Мысли:
-
obj.class.methods.include? :newприятный, но слишком хакерский, я думаю, что он имеет плохую производительность. -
Marshalтакже выглядит как overkill - спасение одной строки могло быть лучшим решением, но на данный момент невозможно создать однострочное спасение типа (IIUC matz на этом!), и как @JörgWMittag упомянул о своей ошибке.
- Лично я думаю, что
dupопределяется на уровне объекта неправильно.
Итак, цитируя @Linuxios
На самом деле нет лучшего способа