Цикл вокруг массива вперед и назад - PullRequest
0 голосов
/ 19 марта 2019

Это моя функция для перемотки вперед от заданного индекса. Я ищу поведение, чтобы перейти от 1 до 2 к 3 к 4, затем вернуться к 1 и повторить.

def forward(letter)
  arr = ['a', 'b', 'c', 'd']
  if arr.find_index(letter) < 3
    arr[arr.find_index(letter) + 1]
  elsif arr.find_index(letter) == 3
    arr[0]
  end
end

forward('d') # => 'a'
forward('b') # => 'c'

и у меня есть аналог, чтобы вернуться назад.

Есть ли лучший способ сделать это?

Ответы [ 4 ]

4 голосов
/ 19 марта 2019

Вместо того, чтобы искать в массиве каждый раз, вы можете использовать хеш:

def forward(letter)
  {'a'=>'b', 'b'=>'c', 'c'=>'d', 'd'=>'a'}[letter]
end

forward('d') #=> "a"
forward('b') #=> "c"

Вы можете легко построить такой хеш из массива, используя zip и rotate:

arr = %w[a b c d]
#=> ["a", "b", "c", "d"]

hash = arr.zip(arr.rotate).to_h
#=> {"a"=>"b", "b"=>"c", "c"=>"d", "d"=>"a"}

invert хеш для перемещения назад:

hash.invert
#=> {"b"=>"a", "c"=>"b", "d"=>"c", "a"=>"d"}
2 голосов
/ 19 марта 2019
def forward(letter)
  arr = ['a','b','c','d']
  i = arr.find_index(letter)
  arr[(i + 1) % arr.length]
end
1 голос
/ 19 марта 2019

Альтернативный способ сделать это с помощью счетчика циклов и цикла.

def forward letter
  enum = ['a', 'b', 'c', 'd'].cycle
  loop {
    n = enum.next
    break enum.peek if n == letter
  }
end

forward 'a' #=> 'b'
forward 'b' #=> 'c'
forward 'c' #=> 'd'
forward 'd' #=> 'a'
0 голосов
/ 19 марта 2019

Как это?

def forward(number)
  arr = [1, 2, 3, 4]
  return arr[number % arr.size]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...