2011-08-10 12 views

Odpowiedz

21

Jeśli poprawnie rozumiem, chcesz to:

def string_shuffle(s) 
    s.split("").shuffle.join 
end 

string_shuffle("The Ruby language") 
=> "ea gu bgTayehRlnu" 
+1

Jeśli potrzebujesz dużo tasowania, warto użyć opcji 'shuffle!' Zamiast 'shuffle'. Jest nieco szybszy. – defhlt

+2

Możesz użyć 'chars' zamiast' split ("") ' –

2

shuffle nie przyjmuje (i nie potrzebuje) argumentów. Zastosowanie:

s.split(//).shuffle.to_s 
6

return s jest zarówno niepotrzebne i błędne. Nie jest potrzebna, ponieważ Ruby zwraca to, co jest wykonywane jako ostatnie i niepoprawne, ponieważ nie zmieniasz s, tworzysz nowy ciąg.

Co więcej, można po prostu dodać metodę shuffle bezpośrednio do String, jeśli okaże się przydatna, ale uważaj na monkeypatching za dużo.

class String 

    def shuffle 
    self.split('').shuffle.join 
    end 
end 
+1

możesz umieścić to w module, a następnie zastosować moduł do łańcucha, który chcesz wpłynąć, w ten sposób nie wpłynie to na inne ciągi w aplikacji i spowodować niepożądane efekty . –

+0

@Joseph, jak uzyskać moduł wpływający na określoną instancję łańcucha? Przykład lub link będzie świetny. Również Josh może ci się przydać [pytanie o monkeypatching] (http://stackoverflow.com/questions/394144/what-does-monkey-patching-exactly-mean-in-ruby). – Zabba

+0

@Zabba http://www.ruby-doc.org/core/classes/Module.html sprawdź przedłużenie. małpa łata zmienną, a nie klasę. –

1

spróbować tej

s.split('').shuffle.join 
2

To jest szybciej. 'hello'.chars.shuffle.join

Sprawdź się:

require 'benchmark' 

str = 'Hello' * 100 
Benchmark.bm(10) do |x| 
    x.report('chars')  { str.chars.shuffle.join } 
    x.report('split')  { str.split('').shuffle.join } 
    x.report('split regex') { str.split(//).shuffle.join } 
end 
0

to zrobi:

s.chars.shuffle.join 

Przykład:

s = "Hello, World!" 
puts s.chars.shuffle.join 

wyjściowa:

olH!l rWdel,o