Я хотел использовать value.respond_to?(:dup) ? value.dup : value
, чтобы проверить, могу ли я дублировать объект, но он не с TypeError
на booleans, ноль или такие «примитивы».Как проверить, действительно ли переменная отвечает на: dup?
Я закончил с:
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
также выглядит как массовое убийство- одна линия спасение могло бы быть лучшим решение, но тип конкретного спасения одной линии невозможен в это время (IIUC matz is on that!), и как @ JörgWMittag упомянул о своем неправильном.
- Лично я думаю, что
dup
определяется на уровне объекта неправильно.
Так, цитируя @Linuxios
Существует на самом деле не лучший способ
Что версия рубин вы используете? Я на 1.9.3 и 'value.respond_to? (: Dup)' где значение является логическим, возвращает 'false' мне, а не' type error'. Аналогично нильсам и другим. – Nerve
@Nerve 1.9.3-p484 ... –
FWIW для этого есть открытая проблема, но она не получила большого внимания: https://bugs.ruby-lang.org/issues/11929 –