Je voudrais obtenir ce qui suit en introduisant un nouvel opérateur (par exemple :=
)Comment créer un opérateur pour la copie/le clonage profond d'objets dans Ruby?
a := b = {}
b[1] = 2
p a # => {}
p b # => {1=>2}
Pour autant que je comprends, je dois modifier la Object
classe, mais je ne sais pas quoi faire pour pour obtenir ce que je veux.
require 'superators'
class Object
superator ":=" operand # update, must be: superator ":=" do |operand|
# self = Marshal.load(Marshal.dump(operand)) # ???
end
end
Pourriez-vous m'aider?
Mise à jour
Ok, superators ne sera probablement pas me aider, mais je veux encore tel opérateur. Comment puis-je (ou vous) créer une extension pour Ruby, que je pourrais charger en tant que module?
require 'deep_copy_operator'
a !?= b = {} # I would prefer ":=" but don't really care how it is spelled
b[1] = 2
p a # => {}
p b # => {1=>2}
Sûrement l'opérande va après le faire, non? Parce que c'est un argument de bloc? – Chuck
Ok, merci, ça doit être une méthode de block not. Utiliser 'deep_clone' aiderait, mais cela le rend désordonné, surtout si on n'a pas 2 mais 5 hachages à initialiser. Donc, je suis vraiment curieux de faire un tel opérateur. – Andrei
@chuck - Vous avez raison; J'ai fait une faute de frappe; @Andrei - C'est impossible sans être vraiment en désordre, parce que vous voulez fondamentalement modifier 'self', ainsi qu'appeler une méthode sur un objet qui n'est pas encore défini. –