我想轉換這樣的陣列:
["apple","banana","pineapple","plum","pear"]
到
I like plum, pineapple, banana, pear *and* apple.
我目前的代碼是這樣的:
%Q{
I like #{%w[apple banana pineapple plum pear].shuffle.yield_self{|q| [q[0..-2].join(", "),q[-1]].join(" and ") }}
}
還有 %w[clever clean 更短高效的 ruby??esque].magic() 方法嗎?
uj5u.com熱心網友回復:
我不知道這是否更聰明或更干凈,但我們開始:
def to_sentence(ary)
ary = ary.dup.shuffle
[ary.pop, ary.join(', ')].reverse.join(' and ')
end
uj5u.com熱心網友回復:
我想提供兩種解決方案。兩者都不會改變作為引數傳遞給方法的陣列。
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"
正則運算式匹配字串中后面沒有跟隨另一個逗號的逗號(即,它匹配字串中的最后一個逗號)。(?!.*,)是一個負面的前瞻。
正則運算式也可以寫成
/.*\K,/
.*匹配除行終止符以外的任何字符,盡可能多(包括逗號),因為*默認情況下是greedy。\K然后將匹配的開頭重置為字串中的當前位置(就在最后一個逗號之前),并從回傳的匹配中丟棄任何先前使用的字符。然后匹配一個逗號,它必然是字串中的最后一個逗號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/350584.html
