Questa è una domanda sulle convenzioni. I due gruppi di comandi seguenti restituiscono risultati identici.Convenzione ruby per l'accesso al primo/ultimo elemento nell'array
a = [1, 2, 3]
a.first # => 1
a[0] # => 1
a.last # => 3
a[-1] # => 3
Quale di questi è preferito in Ruby, l'indice esplicito o le funzioni? Supponendo, naturalmente, che questo sia nel codice che sempre accede al primo o all'ultimo elemento.
Nota: ho pensato ai cicli che ciascuno avrebbe intrapreso. Poiché first
e last
accettano parametri, avranno un po 'più di overhead, ma non so se ciò influisce su ciò che la comunità preferisce.
Grazie!
EDIT
Se si leggono i commenti su questo post, ci fu un grande dibattito circa il mio ultimo paragrafo. Mentre non ero riuscito a ricordare che [x]
è equivalente a .[](x)
, avevo ragione nella mia conclusione che il primo e l'ultimo hanno un po 'più di overhead. Considerando la natura di entrambi, credo che ciò sia dovuto alla verifica degli argomenti per first
/last
. Questi devono controllare se ci sono argomenti mentre []
può presumere che essi esistano.
CODICE
require 'benchmark'
a = [1..1000]
MAX = 1000000
Benchmark.bm(15) do |b|
b.report("small first") { MAX.times do; a.first; end }
b.report("small [0]") { MAX.times do; a[0]; end }
b.report("small last") { MAX.times do; a.last; end }
b.report("small [-1]") { MAX.times do; a[-1]; end }
end
a = [1..100000000000]
Benchmark.bm(15) do |b|
b.report("large first") { MAX.times do; a.first; end }
b.report("large [0]") { MAX.times do; a[0]; end }
b.report("large last") { MAX.times do; a.last; end }
b.report("large [-1]") { MAX.times do; a[-1]; end }
end
RISULTATI
user system total real
small first 0.350000 0.000000 0.350000 ( 0.901497)
small [0] 0.330000 0.010000 0.340000 ( 0.857786)
small last 0.370000 0.000000 0.370000 ( 1.054216)
small [-1] 0.370000 0.000000 0.370000 ( 1.137655)
user system total real
large first 0.340000 0.010000 0.350000 ( 0.897581)
large [0] 0.320000 0.010000 0.330000 ( 0.889725)
large last 0.350000 0.000000 0.350000 ( 1.071135)
large [-1] 0.380000 0.000000 0.380000 ( 1.119587)
Credo sia la prima e l'ultima perché rende più facile la preparazione e il rubino è un linguaggio che deve essere letto. Inoltre rende più facile per le persone dare un'occhiata al tuo codice e sapere cosa stai facendo –
Questa è probabilmente una questione di opinione più che "cosa è meglio", ma preferirei "prima" e "ultima" se è esattamente ciò che intendevo . Se sei davvero preoccupato per le prestazioni in tempo reale, Ruby probabilmente non è la tua migliore scelta di linguaggi di scripting. ;) – lurker
Utilizziamo 'first' e' last' perché sono disponibili. Sono disponibili perché sono necessari molto più spesso. Altri accessors per le posizioni dell'array sono disponibili in Rails, ma non sono davvero così utili o leggibili e, sebbene le persone possano usarli, vediamo la notazione '[n]' più spesso. Non è molto più difficile leggere '[n]', ed è infinitamente più pratico in quanto sono facili da usare nei loop. –