Me gustaría transformar dicha matriz:
["apple","banana","pineapple","plum","pear"]para
I like plum, pineapple, banana, pear *and* apple.Mi código actual es como:
%Q{ I like #{%w[apple banana pineapple plum pear].shuffle.yield_self{|q| [q[0..-2].join(", "),q[-1]].join(" and ") }} }¿Hay algún enfoque más %w[limpio inteligente, más corto, eficiente, rubyesco].mágico()?
No sé si esto es más inteligente o más limpio, pero aquí vamos:
def to_sentence(ary) ary = ary.dup.shuffle [ary.pop, ary.join(', ')].reverse.join(' and ') endMe gustaría ofrecer dos soluciones. Ninguno muta la matriz que se pasa al método como argumento.
arr = ["apple", "banana", "pineapple", "plum", "pear"]#1
def to_sentence(arr) *all_but_last, last = arr.shuffle all_but_last.join(', ') << ' and ' << last end to_sentence(arr) #=> "pear, plum, pineapple, apple and banana" to_sentence(arr) #=> "banana, pear, pineapple, plum and apple" to_sentence(arr) #=> "banana, plum, apple, pineapple and pear" to_sentence(arr) #=> "banana, pineapple, pear, apple and plum"#2
def to_sentence(arr) arr.shuffle.join(', ').sub(/,(?!.*,)/, ' and') end to_sentence(arr) #=> "banana, plum, pear, apple and pineapple" to_sentence(arr) #=> "pear, plum, pineapple, banana and apple" to_sentence(arr) #=> "apple, pineapple, plum, pear and banana" to_sentence(arr) #=> "apple, plum, pear, pineapple and banana" La expresión regular coincide con una coma que no va seguida de otra coma en la cadena (es decir, coincide con la última coma de la cadena). (?!.*,) es una anticipación negativa .
La expresión regular también podría escribirse
/.*\K,/ .* coincide con cualquier carácter que no sea un terminador de línea, tantos como sea posible (incluidas las comas), porque * es por defecto codicioso . \K luego restablece el inicio de la coincidencia a la ubicación actual en la cadena (justo antes de la última coma) y descarta los caracteres consumidos previamente de la coincidencia que se devuelve. Luego se empareja una coma, que necesariamente es la última coma de la cadena.