Синтаксический сахар
В 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
в блок кода, добавив &
перед названием аргумента
def map_val(val, &func)
func.call(val)
end
# вместо передачи proc мы объявляем его как блок кода
puts map_val(100) {|x| x + 1 }
Скобки не нужны
По ходу курса мв привыкли писать наши методы с помощью скобок def method(arg)
, но на самом деле скобки в ruby не являются обязательным атрибутам,с соответсвенно мы можем записать метод в формате def method arg
.
Важно не комбинируйте между собой разные стили написания скобок. Если вы пишете вашу программу без них, то пишите и дальше, если с ними, то пишите всю программу с их использованием. В таком случае вам не придется каждый раз привыкать глазами к новому стилю.
Записать, только если ранее не было записано
Возможно вы уже сталкивались с необходимостью проверять каждый раз на nil
переменную перед тем как записать в нее значение и выглядело это следующим образом:
var = nil
if var.nil?
var = 10
end
на самом деле такую запись можно заметно сократить до:
var = nil
var ||= 10
puts var # = 10
var ||= 20
puts var # = 10
метод []
При работе с массивами или хэш таблицей мы сталкивались с обращением к значению по индексу или ключу с помощью arr[index]
, но на самом деле такая запись доступна для собственных классов тоже
class MyHash
@hash = {}
def [](key)
@hash.[key]
end
def []=(key, value)
@hash.[key] = value
end
end
my_hash = MyHash.new
my_hash[:hello] = 'world'
puts my_hash[:hello] # = world
Если можно обойтись без цикла, значит лучше без него
Циклы являются самыми старыми конструкцйиями любого языка, но с прошествием времени появились такие методы как .each
, .map
, .select
, которые на данный момент являются более предпочтительным вариантом записи. Конечно в 100% случаев нельзя обойтись только ими, поэтому если в вашей программе проще и чище обойтись циклом, значит не стоит пытаться придумать как обойтись без них.
Задание refactoring
arr = [1, -2, 3, -4, 5]
result = arr.select { |x| x >= 0 }
puts result
arr = ["a", "b", "c"]
puts arr.map { |x| x.upcase }
hash = {name: "John", age: 30}
result = []
hash.each { |k, v| result << "#{k}: #{v}" }
puts result
Сделайте этот код более чище с помощью синтаксического сахара
Last updated