После того, как я начал работать в моей нынешней компании, я понял, что мне нужно научиться программировать на Ruby. Поскольку я использую Python со времен колледжа, изучение нового языка программирования не составило для меня большого труда. Неудивительно, что синтаксис и стиль Ruby отличаются от Python, но я хотел бы дать вам несколько советов, если вы хотите изучить Ruby и иметь опыт работы с Python, чтобы ускорить процесс обучения!

Знакомство с двойными кавычками для строк
Вставка переменной в строку в Ruby очень проста, так как вы вставите в строку «#{variable}», аналогично f string в Python. Например, если у вас есть переменная age = 10, я могу поместить приведенный ниже код, чтобы напечатать возраст человека в строке.

Однако сначала меня смутило, почему иногда это работает, но иногда я получаю сообщение об ошибке. Затем я узнал, что «#{переменная}» работает только со строкой в ​​двойных кавычках. Как новый программист Ruby, я не знал, в чем разница между строкой, использующей одинарные и двойные кавычки. По-видимому, вы можете вставить «#{}» и escape-последовательность только в двойные кавычки, и любой синтаксис вызовет ошибку, если он вставлен в строку с одинарными кавычками.

# To print a person's age
age = 10
puts “The person’s age is #{age}”

Лучше всего всегда определять строку в одинарных кавычках, если только вам не нужно вставлять «#{}» или escape-последовательность.

Привыкание к синтаксису Ruby — особенно к нулю
Попробуйте на мгновение забыть о синтаксисе стиля Python, когда пишете код на Ruby! В первом скрипте моя голова всегда думает, если переменная равна None при написании кода на Ruby. Null имеет собственное ключевое слово во многих языках программирования, его синтаксис в Ruby — nil, и используется .nil? для подтверждения того, является ли переменная нулевой/

Отступ заменяется словом "конец"
Отступ — это фишка Python! В Ruby такого правила нет, вы используете ключевое слово end, чтобы закрыть функцию. Это похоже на скобки, используемые в Java. Помимо рассеянности после выходных, частой причиной, по которой я забываю поставить ключевое слово конец после функции, является то, что слишком много функций требуют, чтобы я поставил конец. > чтобы закрыть функцию. Хорошая привычка, которую я получил от программирования Java, заключается в том, чтобы помещать комментарий после закрывающей скобки, чтобы указать, какую функцию я закрываю, и я перенес эту хорошую привычку в Ruby, чтобы поместить комментарий end func или конец, если.

def some_func(num1, num2)
    if num1 > num2
        then puts "#{num1} is greater than #{num2}"
    else
        puts 'num1 is a small number!'
    end # end if
end # end func

Добавление комментария для закрытия функции очень помогает при отладке! Хотя отступы не являются правилом в Ruby, вы все равно должны сделать все возможное, чтобы ваш код был более читабельным. Эта штука с Python не обязательна, но определенно является хорошей привычкой и упрощает отладку вашего скрипта.

Boolean не является типом данных
Удивительно, но True и False — это два разных типа данных в Ruby! Это означает, что Boolean не существует в Ruby как тип данных. True сам по себе является одним типом данных; false сам по себе является другим типом данных. Отрицание значения true или false в Ruby аналогично преобразованию переменной из одного типа в другой.

Другой уникальный синтаксис, связанный с истинным или ложным значением в Ruby, — это выражение «если» — отрицание оператора «если». Это очень полезно, если вы хотите засвидетельствовать, является ли некоторое условие истинным или ложным.

# Let's pretend we want to print if num is not 0
unless num == 0
   then puts num
end # end unless

Использование оператора «если» не так просто, как новый рубист, потому что оно включает в себя много «мыслей об отрицании» в вашей голове, не расстраивайтесь, если вы сбиты с толку с самого начала!

Говоря об утверждении «если»: если вы хотите проверить, не является ли переменная нулевой, у вас должна быть привычка использовать выражение «если» для подтверждения, как показано ниже:

# Python way
if var is not None:
    print('Variable is null')
# Ruby way
unless var.nil?
    then puts 'Variable is null'
end # end unless

Стиль Ruby вместо привычки Python
Хотя Ruby принял синтаксис стиля Python для итерации элементов в массиве (для i в стиле some_array), лучше привыкните к стилю Ruby функции each().

# some_array is an array with numbers
# This is the Python style
for i in some_array do
    puts i
end # end for
# It works but not very Rubyist
# Try to write this instead
some_array.each{|i| puts i}

Одна из причин, по которой я стараюсь избегать использования каждой функции в начале, заключается в том, что я думал, что каждая функция может выполнять только одну операцию для каждой итерации, поскольку в скобках нет места для размещения более одной операции. Лишь пару месяцев спустя я понял, что можно выполнять несколько операций с небольшим изменением синтаксиса! Просто замените квадратную скобку ключевым словом «do» и завершите каждую функцию словом «end». Это особенно полезно, когда вам нужно поставить оператор if:

# If you have multiple operations within each function
some_array.each do |i|
   if i>=0 
       then puts i
   else 
       puts "#{i}" is a negative number
   end # end if
end # end each

Если вы примете синтаксис стиля Ruby, ваш код не только станет более аутентичным как Rubyist, но также поможет вам понять и привыкнуть к использованию конвейера для аргументов в других функциях. Другая распространенная задача, которую вы можете выполнить, — сохранить данные в CSV-файле с помощью CSV-гема, который использует конвейер для приема аргументов для открытия файла и записи в него данных.

CSV.open(filename,"w") do |csv_file|
        some_array.each{|i| csv_file << i}
end # Close csv

Знать, что такое Symbol
Символ вызывает путаницу у многих новичков в Ruby, таких как я, особенно когда они учились писать классы на Ruby. Написание класса на Ruby очень удобно, потому что вы можете использовать оценщик атрибутов как комбинацию функций «getter» и «setter» для получения или установки атрибута с объектом класса:

class person
	def initialize(age) # Constructor
		@age = age
	end

	# Setter + Getter function
	attr_accessor :age
end

Однако меня очень смутил синтаксис двоеточия и атрибута, и я ошибочно подумал, что это особый тип переменной. Оказывается, символ в Ruby — это неизменяемая строка, позволяющая использовать несколько ссылок без использования дополнительной памяти для повышения эффективности. Это не переменная и не строка, а специальный экземпляр Ruby, о котором следует помнить, чтобы использовать его при написании уроков для новичков в Ruby.

Мой другой вариант использования символов — использование Sequel, жемчужины Ruby для запросов к реляционной базе данных. При запросе с помощью Sequel для выполнения требуются имена столбцов в символах. Например, когда у нас есть таблица цен на акции, и мы хотим, чтобы цена акций Apple была в хронологическом порядке:

# This is same as select * from fund_price where ticker='AAPL' order by pricedate
result = ds.select(:ticker, :pricedate, :price).order(:pricedate).where(ticker: 'AAPL').all

Если у вас есть список имен столбцов в виде строки, используйте .to_sym для преобразования строк в символы.

Заключение
Изучение Ruby — это развлечение для питониста, и изучение Python не займет много времени, если вы знаете Python. Но старайтесь не писать код на Ruby в духе Python, например кодировать для i в некотором_массиве, попробуйте попрактиковаться в кодировании Ruby с его родным синтаксисом, например, с использованием функции each!