Сегодня мой первый день в Makers Academy, учебном лагере веб-разработки в Лондоне, и я чувствую, что это снова первый день в школе. Это означает, что вчера был мой последний день 4-недельного предварительного курса, во время которого, среди прочего, я несколько раз терялся в переполнении стека и узнал, что в Ruby каждый класс является объектом, а сам объект является классом (все Я могу думать о дилемме курица или яйцо). Список не будет исчерпывающим без добавления моего первого поста в блоге.

Мне никогда не нравилось писать, но меня всегда привлекала идея, что каждый человек должен быть хорошим писателем. Когда я читаю что-то красиво написанное, меня переполняет радость, удовлетворение и восхищение. Поэтому я решил, что пришло время столкнуться со своей борьбой и отправиться в путешествие, чтобы стать лучшим писателем. Недавно я наткнулся на цитату J.P. Morgan, в которой говорится, что «первый шаг на пути к чему-то — это решить, что вы не собираетесь оставаться на месте». Чтобы получить удовольствие от этого усилия, я сосредоточусь на процессе, а не на цели, и задам себе простой вопрос: «Сегодня я писатель лучше, чем вчера?» Блог будет для меня способом усвоить знания и улучшить свои навыки письма, размышляя о своем опыте в Makers Academy.

Я намерен писать о 10 лучших вещах, которые я усвоил каждую неделю, и постараюсь, чтобы они были краткими. Если я нахожу концепцию особенно интересной, я напишу отдельную запись в блоге на эту тему. Я буду называть их нейронами, поскольку каждый из них будет способствовать моему пониманию программирования. Некоторые из них будут весьма конкретными, в то время как другие будут касаться общих концепций языков программирования и информатики. Первые несколько недель нейроны будут укреплять мои знания Ruby. Без лишних слов, вот топ-10 нейронов из второй половины предварительного курса.

1. Используйте короткие методы

Чтобы улучшить читаемость, старайтесь писать методы как можно короче. Извлекайте логические разделы вашего кода в разные методы и держите каждый метод в пределах 5 строк кода.

2. Интересный способ использования return, но будьте осторожны

Используйте ключевое слово return без выражения, чтобы выйти из метода. Вы также можете использовать его с оператором условия, выходя из метода, если условие выполнено. Рассмотрим следующий метод:

def loading_file
  filename = ARGV.first
  return if filename.nil? # get out of the method if it isn't given
  ...
end

Обратите внимание, что вызов return без указания возвращаемого объекта приводит к nil, который возвращается по умолчанию. Чтобы лучше это проиллюстрировать, рассмотрим следующий код:

def fizzbuzz(number)
  return "Fizz" if n % 3 == 0
  number
end

Если число кратно 3, метод вернет строку «Fizz». В противном случае он вернет ноль. Ключевое слово return всегда выведет вас из метода/блока независимо от того, было ли выполнено условие или нет. Последняя строка кода, которая должна неявно возвращать число, никогда не будет достигнута.

3. Каждый метод возвращает значение. Захватите его или потеряйте.

4. «gets» и «STDIN.gets»

Метод gets() читает из списка файлов, переданных в качестве аргументов, по умолчанию только с клавиатуры (или стандартного потока ввода), если файлов нет. Если вы передаете аргументы вашей программе на Ruby из командной строки, используя массив ARGV для их захвата, метод gets() запутается. Вместо этого вам нужно явно указать, что вы хотите получить информацию из входного потока с помощью STDIN.gets().

5. Параллельное назначение

Вы можете назначить несколько переменных одновременно: bootcamp, city = "Makers Academy", "London". Это не кажется слишком захватывающим, но подумайте об этом:

animal = ["cat", "Garfield", "orange"]
type, name, color = animal
"#{name} is an #{color} #{type}." #Garfield is an orange cat. 

6. Сила диапазона

По какой-то причине я все время забываю о классе Range, который был весьма полезен при решении некоторых ката на Codewars. Подобно массиву, класс Range включает модуль Enumerable, позволяющий нам передавать сообщения, такие как each. Единственное предостережение заключается в том, что методы, которые обрабатывают диапазон как последовательность, ожидают, что объект начала реализует метод succ для возврата следующего объекта в последовательности.

Рассмотрим функцию, которая принимает одно целое число в качестве аргумента и возвращает сумму всех целых чисел (до номера этого аргумента), кратную 3 и/или 5. Вместо использования громоздких операторов if/else мы можем создать диапазон (0...number)и выполнить итерацию по нему. это методом select.

def multiples(number)
  (0…number).select { |num| num % 3 == 0 || num % 5 == 0}.inject(:+)
end

7. Метод «сортировка»

sort_by сортирует массив, используя возвращаемые значения из заданного блока. Рассмотрим следующий пример:

array = ["London", "New York", "Tokyo", "Berlin", "LA"]
array.sort_by { |city| city.length }

За кулисами sort_by использует оператор <==> для сравнения каждого элемента коллекции. Оператор сравнения принимает два аргумента и возвращает -1, если первый аргумент меньше второго, 1, если второй аргумент меньше первого, или 0, если они эквивалентны.

3 <==> 5 # -1
3 <==> 3 # 0
5 <==> 3 # 1

Обратите внимание, что города будут отсортированы по количеству символов от меньшего к большему (по умолчанию <==>). Вы можете просто вызвать reverse для возвращаемого значения, если хотите отсортировать их от большего к меньшему.

Теперь рассмотрим более интересный сценарий. Представьте, что у вас есть массив хэшей, каждый из которых содержит имя студента и месяц его рождения. Вы хотите отсортировать их по месяцу, когда они родились. Проблема здесь в том, что если вы вызовете sort_by на students[:birth_month], они будут отсортированы в алфавитном порядке. Вместо этого я решил поместить все месяцы в упорядоченный список (или массив).

months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
students.sort_by! { |student| months.index(student[:birth_month])}

Метод sort_by будет использовать индексы из массива месяцев, чтобы отсортировать их в правильном порядке.

Обратите внимание, что метод sort_by может быть совершенно непредсказуемым при сравнении двух одинаковых значений.

8. Передайте блок методу File.open, чтобы избежать его последующего закрытия
Чтобы записать в файл, нам нужно сначала «открыть» файл. Мы делаем это с помощью метода open, который возвращает ссылку на файл и может быть присвоен переменной (см. первый сценарий ниже). Во втором сценарии используется блок кода, в котором переменная «f» указывает на ссылку на открытый файл. После выполнения блока кода файл автоматически закрывается.

file = File.open("cats.csv", "w")
file.puts ...
file.close
vs. 
File.open("cats.csv", "w") { |f| f.puts ...}

9. Изменение последнего коммита

Вы когда-нибудь совершали что-то только для того, чтобы понять, что забыли добавить одну маленькую деталь? Больше не нужно беспокоиться. Вы можете изменить свой последний коммит и сохранить сообщение коммита, используя git add, а затем git commit --amend. Это откроет редактор vim, и все, что вам нужно сделать, это нажать ESC, а затем «: q», и ваш последний коммит будет обновлен.

10. Гит дифф

  • Используйте git diff для сравнения вашего рабочего каталога с вашей промежуточной областью.
  • Используйте git diff --cached, чтобы сравнить вашу промежуточную область с вашим последним коммитом.
  • Используйте git diff HEAD, чтобы увидеть все изменения, которые вы сделали с момента последней фиксации, независимо от того, были ли они подготовлены.