Le estensioni per gli Array
sono probabilmente le più interessanti, insieme a quelle per Hash
, Object
, Module
e Kernel
. Vediamo alcuni esempi.
Ruby mette a disposizione i metodi Array#first
e Array#last
per accedere rapidamente al primo ed ultimo elemento di un array. ActiveSupport
introduce and Array#second
, Array#third
, Array#fourth
e Array#fifth
.
Esiste anche il metodo Array#forty_two
, con probabili riferimenti alla famosa risposta.
require '../helper' colors = %w(red yellow green blue) colors.first# => red colors.second # => yellow colors.third# => green colors.fourth # => blue
Inoltre, i metodi Array#from
e Array#to
consentono di accedere agilmente a dei sottoinsiemi dell'array originale.
require '../helper' colors = %w(red yellow green blue black white) colors.from(3)# => ['blue', 'black', 'white'] colors.to(3) # => ['red', 'yellow', 'green'] colors.from(2).to(1) # => ['green', 'blue']
Questi due metodi potrebbero tornare molto utili. Ipotizziamo di avere un array di oggetti Post
di un blog e di voler mostrare un layout completo per il primo e solo delle headlines per i rimanenti. Ecco una soluzione
elegante.
require '../helper' class Post < Struct.new(:id, :title, :content) end posts = (1..10).collect do |index| Post.new( index, "Title post #{index}", "This is the content for post #{index}.") end # mostra i post se l'array non è vuoto if post = posts.first puts "<h2>#{post.id}. #{post.title}</h2>" puts "<p>#{post.content}.</p>" # mostra headline puts "<ol>" posts.from(2).each do |post| puts "<li>#{post.title}</li>" end puts "</ol>" end
Tra le estensioni dedicate alla conversione la più interessante è Array#to_query
, decisamente utile per chi ha necessità di lavorare con URL e query string. Array#rand
permette di
estrarre random un elemento dall'array. Si tratta di semplici utility ma è estremamente formativo andare a curiosare l'implementazione di questi metodi per migliorare la propria conoscenza di Ruby.
# Definizione del metodo Array#rand
def rand
self[Kernel.rand(length)]
end
Forse il metodo più interessante è Array#extract_options!
. Questo metodo è largamento diffuso in Rails in tutti quei metodi che accettano illimitati parametri ed una serie di
parametri opzionali passati per keyword. Un esempio sono i validatori.
validate_presence_of :attr1, :attr2 validate_presence_of :attr1, :attr2 validate_presence_of :attr1, :attr2, :option1 => true, :options2 => 'foo'
Questo metodo chiamato sull'array parametro separa gli argomenti dalle opzioni. Ecco alcuni esempi tipici di utilizzo.
require '../helper' def print_params(*args) puts "params: " + args.inspect options = args.extract_options! puts "args: " + args.inspect puts "options: " + options.inspect end print_params :attr1, :attr2 # => params: [:attr1, :attr2] # => args:[:attr1, :attr2] # => options: {} print_params :attr1, :attr2 # => params: [:attr1, :attr2] # => args:[:attr1, :attr2] # => options: {} print_params :attr1, :attr2, :option1 => true, :options2 => 'foo' # => params: [:attr1, :attr2, {:options2=>"foo", :option1=>true}] # => args:[:attr1, :attr2] # => options: {:options2=>"foo", :option1=>true}