Tłumaczenie Python'a na Ruby'ego

0

Cześć
Znalazłem taki kod:

ret = ['']
letters = 'abcedfg'
ret = [prefix+letter for prefix in ret for letter in letters]

Napisany w Pythonie i próbuje go przetłumaczyć na Ruby'ego tak wygląda moj kod:

ret = ['']
letters = "abded"
letters = letters.split(//)
for prefix in ret do
  for letter in letters do
    print ret << prefix + letter
  end
end

Ale moj problem polega na tym, że otrzymam pętlę nieskończoną. Nie wiem jak zrozumieć
to wyrażenie

ret = [prefix+letter for prefix in ret for letter in letters]

.
Proszę bardzo o pomoc.

0

to pętla w pętli
dla każdego prefiksu w ret i litery w letters zwraca połączenie prefiksu z literą
u ciebie pewnie się tworzy nieskończona pętla bo zapisujesz w tym samym miejscu z którego pobierasz prefiksy i dochodzą ciągle nowe elementy a w pierwotnym kodzie najpierw nowe elementy zapisuje w jakimś "anonimowym" miejscu a potem dopiero przypisuje je do zmiennej "ret"
dodaj po prostu jeszcze jedną zmienną prefiksy a print daj na końcu

0

Dzięki pomoglo dodanie nowej tablicy a poźniej

ret = ret | nowa_tablica
1

Python nie modyfikuje istniejącego ret, comprehension buduje kompletną nową listę. Spróbuj tak:

ret = ret.flat_map do |prefix|
  letters.map do |letter|
    prefix + letter
  end
end
1

Jeśli chcesz to napisać w "Ruby way" to piszesz:

ret.map { |prefix| letters.split(//).map { |letter| prefix.to_s + letter } }.flatten

Powinno w rezultacie być tak jak [prefix+letter for prefix in ret for letter in letters].

Skoro nie rozumiesz młody padawanie to Ci wytłumaczę:

  • Array#map przeiterowuje przez wszystkie elementy w tablicy i zastępuje je wartością zwróconą przez blok
  • String#split dzieli ciąg w miejscu wystąpienia wyrażenia podanego jako argument, w tym przypadku dzieli na pojedyncze litery
  • Object#to_s zwraca ciąg znaków na bazie danego obiektu. Tutaj jest to potrzebne w razie gdy prefix jest nilem
  • Array#flatten zwraca spłaszczoną tablicę (wszystkie zagnieżdżone tablice zostają przepisane do nadrzędnej tablicy i usunięte)

1 użytkowników online, w tym zalogowanych: 0, gości: 1