В Ruby для одного и того же действия можно найти десяток вариантов решения проблемы, причем не изменяя принцип работы программы. Знание и применение синтаксического сахара позволяет сократить кол-во написанного кода, а также получить от других разработчиков уважение и почет.
Сокращаем блок кода до минимума
мы знаем, что записать блок кода мы можем c помощью { |x| ... } и do |x| ... end, но часто бывает так, что код внутри блока может состоять из вызова 1 метода у параметра. В таких случаях мы можем превратить запись arr.map {|x| x.some_method } в эквивалентную ей arr.map(&:some_method).
words=["dog","magic","service"]p words.map{|word| word.capitalize}p words.map(&:capitalize)# работает точно так же как и пример выше, просто короче записывается
Proc => Блок => Proc
Кроме того знак & может служить способом перевода Proc в блок кода добавляя & перед самим proc
func=proc{|x|puts x }# распечает в консоль все ёлементы массив[1,5,2,0].each(&func)
Также мы можем превратить наш proc в блок кода, добавив & перед названием аргумента
defmap_val(val,&func) func.call(val)end# вместо передачи proc мы объявляем его как блок кодаputsmap_val(100){|x| x +1}
Скобки не нужны
По ходу курса мв привыкли писать наши методы с помощью скобок def method(arg), но на самом деле скобки в ruby не являются обязательным атрибутам,с соответсвенно мы можем записать метод в формате def method arg.
Важно не комбинируйте между собой разные стили написания скобок. Если вы пишете вашу программу без них, то пишите и дальше, если с ними, то пишите всю программу с их использованием. В таком случае вам не придется каждый раз привыкать глазами к новому стилю.
Записать, только если ранее не было записано
Возможно вы уже сталкивались с необходимостью проверять каждый раз на nil переменную перед тем как записать в нее значение и выглядело это следующим образом:
на самом деле такую запись можно заметно сократить до:
метод []
При работе с массивами или хэш таблицей мы сталкивались с обращением к значению по индексу или ключу с помощью arr[index], но на самом деле такая запись доступна для собственных классов тоже
Если можно обойтись без цикла, значит лучше без него
Циклы являются самыми старыми конструкцйиями любого языка, но с прошествием времени появились такие методы как .each, .map, .select, которые на данный момент являются более предпочтительным вариантом записи. Конечно в 100% случаев нельзя обойтись только ими, поэтому если в вашей программе проще и чище обойтись циклом, значит не стоит пытаться придумать как обойтись без них.
Задание refactoring
Сделайте этот код более чище с помощью синтаксического сахара