2010-05-20 13 views
2

Je ne suis pas très compétent dans ce domaine, alors j'ai décidé de demander ici. Disons que nous avons une « bibliothèque » à Ruby (ou tout autre passe par le langage de script de référence):Est-il correct de transférer toute responsabilité pour le clonage d'objets à l'utilisateur d'une bibliothèque?

class Moo 
    attr_accessor :bar 
    def initialize 
     self 
    end 
end 

a = 'a string' 
b = Moo.new 
b.bar = a 

b.bar sera évidemment le même objet que a.

Est-il correct de le laisser tel quel dans tous les cas alors le programmeur qui en a besoin les séparera fera-t-il le clonage manuellement? C'est la seule idée saine que j'ai eue avec.

Répondre

2

Après the principle of least surprise, il est correct de conserver la référence à l'objet assigné comme vous l'avez fait.

Si vous avez interne dup l'objet assigné à bar, il serait extrêmement frustrant pour un consommateur de votre bibliothèque qui voulaitbar se référer à l'objet identique.

> class Moo 
> attr_accessor :bar 
> end 
=> nil 
> a = 'a string' 
=> "a string" 
> b = Moo.new 
=> #<Moo:0x2bfd238> 
> b.bar = a 
=> "a string" 
> a.upcase! 
=> "A STRING" 
> b.bar # should be uppercase as expected since `a` was modified *in-place* 
=> "A STRING" 
> b.bar = a.dup # now modifications to `a` will not affect `bar` 
=> "A STRING" 
> a.downcase! 
=> "a string" 
> b.bar 
=> "A STRING" 

Comme une note de côté, def initialize() self end est tout à fait inutile car elle est identique à la valeur par défaut initialize.

+0

J'ai essayé de trouver la réponse à cela pendant un certain temps. Je vous remercie. En ce qui concerne 'initialize' par défaut, il fonctionne en effet. Je me souviens que ce n'était pas il y a quelque temps, mais il semble qu'il y avait un autre problème sans rapport avec l'existence de 'initialize'. –