2009-10-27 6 views
0

Je code suivantrubis question alias_method

class User 
    attr_accessor :name 
end 

u = User.new 
u.name = 'john' 
puts u.name #=> john 

En tout cas ci-dessus fonctionne. Toutefois, ce code ne fonctionne pas

class User 
    attr_accessor :name 
end 

u = User.new 
u.name = 'john' 
u.name('john') 

Afin de résoudre cette question, je l'ai décidé d'utiliser alias_method. Je sais qu'il existe d'autres façons de résoudre le problème, mais je cherche spécifiquement si ce problème pourrait être résolu en utilisant alias_method. Essayer d'apprendre.

code suivant fonctionnera

Cependant ce code
class User 
    attr_accessor :name 
    alias_method :foo, :name= 
end 

u = User.new 
u.foo('john') 
puts u.name 

ne fonctionnera pas pour des raisons évidentes. Tout le monde sait si ce problème peut être résolu avec alias_method.

class User 
    attr_accessor :name 
    alias_method :name, :name= 
end 

u = User.new 
u.name('john') 
puts u.name 

Répondre

3

La version courte est la méthode d'alias ne peut pas vous aider.

Il semble que vous essayiez de fusionner le getter et le setter créés par attr_accessor. La raison pour laquelle cela ne fonctionne pas est que vous remplacez le getter avec le setter lorsque vous appelez un alias.

Pour obtenir la fonctionnalité que vous cherchez, vous devrez définir votre propre méthode.

Quelque chose comme ceci:

class User 
    attr_accessor :name 

    def name(set_value = "VALUE_THAT_WILL_NEVER_BE_USED_AS_A_NAME") 
    unless set_value == "VALUE_THAT_WILL_NEVER_BE_USED_AS_A_NAME" 
     @name = set_value 
    end 
    @name 
    end 

end 

u = User.new 
u.name('john') #=> sets name to john 
puts u.name #=> puts john 

# bonus! doesn't override name= 

u.name = 'mike' # => sets name to mike 
puts u.name #=> puts mike 

Edit: Correction méthode pour permettre paramètre de nul ou faux.

+0

N'est-ce pas le cas si insensé? def nom (valeur_set) @name = valeur_set sauf set_value.nil? fin – CodeJoust

+0

La façon dont j'ai interprété la question, signifier que l'affiche cherchait un moyen d'obtenir et de définir avec la même méthode. Le si est nécessaire, mais la condition n'est pas parfaite. Comme il ne laissera pas nil ou false assigner à @name. – EmFi

4

Je ne comprends pas vraiment ce que vous essayez de faire. En écrivant attr_acccessor :name, la méthode name= est créée automatiquement. Si vous essayez de faire ce travail:

user.name("john") 

vous pouvez ajouter cette méthode:

class User 
    attr_accessor :name 
    def name(n) 
    self.name = n 
    end 
end 
+0

Vous n'êtes pas écrire une réponse, il serait peut-être miseur comme un commentaire. – johannes

+0

Un peu difficile d'ajouter tout cela comme un commentaire, vous ne pensez pas? – Geo

+0

Comme je l'ai dit dans ma question, j'essaie d'apprendre les côtés sombres de alias_method. J'ai essayé de résoudre un problème d'une manière spécifique et j'ai échoué. Je me demandais si quelqu'un avait une solution qui me manquait. C'est tout. Juste apprendre. – Roger

1
class User 
    attr_accessor :name 
end 

u = User.new 
u.name = 'john' 
u.name('john') 

Dans ce code u.name serait le getter pour name. On dirait que vous essayez de l'appeler comme un setter? Est-ce que tu veux faire ça? Si tel est le cas, vous n'utiliserez pas attr_accessor, vous devrez écrire les getters et les setters vous-même.

+0

Je jouais juste avec alias_method et je voulais être sûr que ce que je ne suis pas capable d'accomplir n'est pas possible. Deuxièmement, j'ai eu de merveilleuses réponses. Merci – Roger

3

Si vous souhaitez utiliser une seule méthode getter/setter, prenez garde à ne pas utiliser "nil", car vous voudrez peut-être définir votre attribut sur zéro.



u.name("john") 
u.name(nil) # name still will be john 

donc faire quelque chose qui vérifie qu'il ya args


class U 
    attr_reader :n 
    def n(*args) 
    if(args.length > 0) 
     @n = args.first 
    else 
     @n 
    end 
    end 
end 

u = U.new 
u.n "j" 
u.n # j 
u.n nil 
u.n # nil