Come funziona questo lavoro rubino di accesso personalizzato
-
14-10-2019 - |
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
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