Domanda

Quindi, il metodo seguito in modo dinamico class_eval crea funzioni di accesso per gli attributi definiti in fase di esecuzione. Può essere utilizzato, ad esempio, per creare oggetti di configurazione con gli attributi lette da un file di configurazione (e sconosciuto fino al runtime). I capire tutto questo, tranne per il ramo d'altro. Se ho ragione il ramo altrimenti restituisce il valore dell'attributo (val [0]) se c'è un valore passato in val *. Tuttavia il modo in cui il suo scritto mi aspetterei per tornare un array (val) se non v'è più di un valore passato in * var. In particolare, se ho qualcosa di simile al seguente:

value = 5

poi dalla lettura del codice mi aspetterei @value to be [=,5]. Tuttavia i rendimenti @value 5 e non l'array [=, 5]. Come è possibile?

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
È stato utile?

Soluzione

Segno di uguale non è un argomento per il metodo, è una parte del nome del metodo. In realtà è possibile chiamare l'assegnazione in questo modo:

value=(5)

Quindi, solo numeri interi 5 è un argomento per la funzione

* Aggiornamento

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top