Я хотел использовать 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
На самом деле нет лучшего способа