Рубин следующий кратный
Есть ли другой способ написать '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'