2009-05-28 20 views

risposta

1

L'operatore di splat è scarsamente documentato nella documentazione di base di Ruby a partire da Ruby 2.4. È una caratteristica fondamentale della lingua, tuttavia, e il codice sorgente per l'operatore splat può essere trovato in vm_eval.c sotto rb_yield_splat(VALUE values).

Il unit test per rb_yield_splat lo rende più chiaro ciò che sta accadendo:

it "yields with passed array's contents" do 
    ret = nil 
    @s.rb_yield_splat([1, 2]) { |x, y| ret = x + y } 
    ret.should == 3 
end 
+0

è grandioso, ma come facevi a sapere dove si trova la fonte? –

+0

I [cercato per questo] (https://github.com/ruby/ruby/search?l=C&q=splat&type=&utf8=%E2%9C%93) nel repository git Ruby. Limita la ricerca ai file C, quindi leggi il codice sorgente finché non lo trovi. – anothermh

+0

Wow è grandioso. Grazie. –

7

Una veloce ricerca di Google ha rivelato che è implementato in eval.c. Puoi trovare riferimenti a "splat" in alcuni punti del file, ma non ho familiarità con il funzionamento interno di Ruby per dare un senso a ciò.

+0

Grazie per questo, Martin. Sto solo cercando di dare un senso al mondo Ruby. Quindi, in sostanza, se è rubino e non rotaie, la fonte probabilmente non è in Ruby, il che ha senso. –

+0

L'operatore splat fa parte del linguaggio core ruby, non una funzione di libreria. Può essere utilizzato su qualsiasi oggetto che definisce un metodo #to_ary, ma quando viene utilizzato per raccogliere più valori in una singola variabile (come in 'a, * b = 1,2,3,4,5') creerà sempre un Array. – rampion

+0

@Rampion, grazie per quello. Quindi immagino che la mia vera domanda sarebbe: ci sono delle "funzionalità di libreria" (per le quali il codice sorgente è in Ruby) che non richiedono un "require?" –