Рубин следующий кратный

Есть ли другой способ написать 'a'.next.next? Я осмотрелся и не могу найти это.

Я пытался умножить .next но я продолжаю получать ошибки.

4 ответа

Решение

Ну, это может быть не очень хорошая идея в данном случае, но если вы хотите связать метод n раз в общем, вы можете сделать что-то вроде этого:

2.times.inject('a') { |s| s.next }
# => 'c'

20.times.inject('a') { |s| s.next }
# => 'u'

Это начинается со значения 'a', запускает блок, который вызывает nextЗатем каждый последующий результат возвращается в блок.

Для чего это стоит, обезьяна-патчинг String может подойти для тривиальных сценариев, но лично я сначала попытался бы найти другие решения, например, просто добавить служебную функцию в ваш класс / модуль:

def repeat_next(str, n = 1)
  n.times.inject(str) { |s| s.next }
end

Ярлык для вашей конкретной проблемы, (a.ord + 2).chrпотенциально существует, хотя это не одно и то же.

Вы можете просто переопределить String.next как это:

class String
  alias_method :next1, :next
  def next(n = 1)
    str = self
    for i in 1..n
      str = str.next1
    end
    str
  end
end

puts 'a'.next
puts 'a'.next(2)
puts 'a'.next(20)

Если вы ищете более краткий способ сделать это, вы можете использовать: ('a'.ord + 2).chr, Это преобразует 'a' в числовое представление (с помощью метода "ord"), увеличивает его на два, а затем преобразует обратно в представление символов (с "chr").

Вы можете обезьяна-патч String класс в ruby, чтобы добавить метод, который сделает это за вас:

class String
    def get_nth_char(n)
      current = self
      while n > 0 do
        current = current.next
        n = n - 1
      end

      current
    end
end

Так что вы можете сделать 'a'.get_nth_char(2) # => 'c'

Другие вопросы по тегам