2009-04-29 22 views
18

Mam tablicę tak:Ruby: Jak połączyć elementy tablicy z prefiksem?

["marblecake", "also", "the", 1337] 

Chciałbym wrócić ciąg, który zawiera każdy element tablicy ustalonej przez jakiś określony ciąg znaków, a następnie łączone ze sobą przez inny określony ciąg znaków. Na przykład,

["marblecake", "also", "the", 1337].join_with_prefix("%", "__") 

powinno skutkować

# => %marblecake__%also__%the__%1337 

Jak mogę to zrobić?

Odpowiedz

38

Jeśli tablica jest w a wtedy ten jeden-liner zrobi to

a.map { |k| "%#{k}" }.join("_") 

Można łatwo umieścić to w zależności od własnych - jeszcze dodać go do klasy Array tak, że można to nazwać na tablicy, jak w twoim przykładzie.

Pamiętaj, że "!" wersja mapy (map!) zmodyfikuje tablicę w miejscu - być może nie w twoim zamiarze.

+12

Dlaczego używasz destrukcyjny, wersja w miejscu z „map”? W zależności od tego, jak wygląda kod OP, może to mieć niezamierzone skutki uboczne. –

+0

To załatwiło sprawę. Wielkie dzięki, Cody. –

+0

Jason: Tu zapisywane są tylko prymitywy/ciągi. Czy istnieje alternatywa, którą polecasz? –

2

zgodnie z powyższą sugestią:

class Array 
    def join_with_prefix(prefix,separator) 
    self.collect {|e| prefix.to_s + e }.join(separator) 
    end 
end 

p ['ab','cd','ef'].join_with_prefix('%','__') 
=> "%ab__%cd__%ef"
+2

Zakłada to, że próbujesz dołączyć do tablicy łańcuchów - jeśli masz na przykład tablicę liczb całkowitych, to część "+ e" zawodzi, ponieważ "+" nie jest zaimplementowane dla ciąg + liczba całkowita. Lepszym podejściem byłoby wykonanie konkatenacji ciągów w łańcuchu o podwójnych cudzysłowach z interpolacją ciągów "# {e}", która domyślnie byłaby twoim elementem, stąd: self.collect {| e | "# {prefix} # {e}"} .join (separator) Jest bardziej elastyczny. –

+0

Lub możesz po prostu zrobić 'prefix.to_s + e.to_s' – rampion

-1

Szukałem rozwiązania tego today.I oceniły tę question.This było moje rozwiązanie.

array = ["marblecake", "also", "the", 1337]; 
arrayString = '' 

array.each{|x| arrayString += "%" + x + "__"} 
+0

Niestety działa to tylko z tablicami łańcuchów. –

10

Chociaż jest to bardzo stare pytanie, chciałbym dodać to:

a.any? && "%".+(a.join("__%")) 
+0

To sprytne rozwiązanie! Bardzo mi się to podoba :) –

+0

Jeśli 'a' jest pusty, to zwróci'% 'only – xiaoboa

Powiązane problemy