Question

Ainsi, la méthode ci-dessous en dynamique class_eval crée accesseurs pour les attributs définis lors de l'exécution. Il peut être utilisé, par exemple, pour créer des objets de configuration avec des attributs lus à partir d'un fichier de configuration (et inconnu jusqu'à l'exécution). Je comprendre tout cela, sauf pour la branche d'autre. Si je ne me trompe pas la branche autre renvoie la valeur d'attribut (val [0]) s'il y a une valeur passée * val. Cependant, la façon dont son écrit j'attendre pour retourner un tableau (val) s'il y a plus d'une valeur passée * var. En particulier, si j'ai quelque chose comme ce qui suit:

value = 5

puis de lire le code que je me attends @value to be [=,5]. Cependant le rendement @value 5 et pas le tableau [= 5]. Comment est-ce possible?

class Module
    def dsl_accessor(*symbols)
        symbols.each do |sym|
            class_eval %{
                def #{sym}(*val)
                    if val.empty?
                        @#{sym}
                    else
                         @#{sym} = val.size == 1 ? val[0] : val
                    end
                end
            }
        end
    end
end
Était-ce utile?

La solution

signe égal est pas un argument pour la méthode, il est une partie du nom de la méthode. En fait, vous pouvez appeler l'affectation comme ceci:

value=(5)

Alors que nombre entier 5 est un argument de la fonction

* Mise à jour

class Module
    def dsl_accessor(*symbols)
        symbols.each do |sym|
            class_eval %{
                def #{sym}
                  @#{sym}
                end
                def #{sym}=(val)
                  @#{sym} = val
                end
            }
        end
    end
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top