用於將單詞數組轉換為混洗和逗號分隔的字符串的簡短而高效的 Ruby 代碼,最後一個單詞前有一個“和”?

康斯坦丁

我想轉換這樣的數組:

["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() 方法嗎?

卡里·斯沃夫蘭

我想提供兩種解決方案。兩者都不會改變作為參數傳遞給方法的數組。

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然後將匹配的開頭重置為字符串中的當前位置(就在最後一個逗號之前),並從返回的匹配中丟棄任何先前使用的字符。然後匹配一個逗號,它必然是字符串中的最後一個逗號。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章