Ruby для PHP разработчиков

Перевод статьи: www.tuttoaster.com/ruby-for-php-developers/

Статья для новичков. В оригинале слишком много вау, которые я не стал переводить. Многие конструкции недостаточно полно описаны, но для этого есть официальное руководство.

  • Переменные.
  • Массивы.
  • Логика, циклы и функции.
  • Классы.

Краткое введение


Можно сказать, что PHP и Ruby (+фрейморк) наиболее используемые языки в интернете.

Чтобы установить Ruby надо выполнить следующие шаги:



Переменные


Ruby динамический язык, как и PHP, таким образом не нужно объявлять переменные перед их использованием. Разница здесь в типах — Ruby строго типизированный язык, так что если мы хотим конвертировать число в строку, мы должны вызвать соответствующую функцию. Посмотрим на парочку примеров работы с переменными в PHP и Ruby.

<?php
	$number = 3;
	echo "The number is " . $number;
?>


number = 3
puts "The number is " + number.to_s


Эти скрипты имеют одну задачу: присоединить число к строке и вывести результат. Вот и первые отличия от PHP:

  • Функция PHP «echo» в Ruby называется «puts».
  • В конце строки не ставится точка с запятой.
  • Конкатенация в Ruby выполняется оператором "+", а не точкой.
  • В Ruby нужно преобразовать число в строку, перед тем как отобразить ее.
  • Существуют методы для каждого типа преобразования: «to_i» в число, «to_f» в числа с запятой и «to_s» в строку.


Массивы


Посмотрим на первый шаг использование массивов — создание и доступ к их элементам. Отсчет элементов начинается с нуля.

# Простой массив из трех элементов
animals = ['dogs', 'cats', 'spiders']
puts animals[2] # третий элемент

# Еще один способ создания массива
cars = Array.new
cars << 'BMW'
cars << 'Toyota'
cars << 'Ford'
puts cars[0]

# Хэш (или массив с нечисловыми ключами)
h = Hash["this_is_a_key", 100, "other_key", 200]
puts h['other_key']


Результат выполнения:



Кроме этих методов есть и другие. В PHP можно получить те же самые данные, но в Ruby это делается проще:

animals = ['dogs', 'cats', 'spiders']

puts animals.first # Выведет: dogs
puts animals.last  # Выведет: spiders
puts animals.length  # Выведет: 3


В последних трех строках примера важное отличие от PHP, на котором надо заострить внимание. Мы вызвали «animals.first» вместо «first(animals)», потому что массивы — это объекты. И не только массивы: строки, числа, хэши — тоже объекты. Как будет видно в конце, мы обычно вызываем функции как «x.function» вместо «function(x)».

Логика, циклы и функции


Логика

Ruby располагает все теми же классическими конструкциями, что и PHP: if, else, elsif (не elseif!). Все они завершаются «end», поэтому нет обязательной необходимости использовать фигурные скобки.

number = 70

if number > 90
	puts 'This number is near to 100'
elsif number > 50
	puts 'This number is greater than 50'
else
	puts 'This number is less than 50'
end

# Результат будет: 'This number is greater than 50'


Циклы и функции


Все также как в PHP, но синтаксис отличается. Рассмотрим циклы и функции в одном примере.

# Определение функции
def show_elements(array)
	array.each_with_index do |element,index|  # То же, что и "foreach" в PHP
		puts "#{element} is in the array at #{index} position."
	end
end

animals = ['dogs', 'cats', 'spiders']
# Вызываем функцию
show_elements(animals) # Тот же результат можно получить при помощи "show_elements animals"


Вывод:



Посмотрим на другие циклы. Здесь «while» со счетчиком:

times = 4

now = 1
while now <= times
    puts "Iteration number #{now} of #{times}"
    now += 1
end


В PHP нет «until», а в Ruby есть.

times = 4
now = 1
until now > times
    puts "until #{now} of #{times} times"
    now += 1
end

for i in 1..4
   puts "Looping around 4 times (#{i})"
end


Посмотрим на отличия:



Оба цикла выполнились одинаковое количество раз. Конструкция «for» в Ruby такая же как в PHP, но синтаксис несколько чище.

Другой цикл целиком в духе Ruby. Мы просто говорим сколько раз нам надо выполнить что-нибудь:

5.times do
   puts 'Impossible to be cleaner' # Выведет строку 5 раз
end


Классы


Ruby как и PHP — объектно-ориентированные языки. Это значит что здесь есть классы, методы и атрибуты. Посмотрим на класс.

# Определяем класс "company"
class Company
  def initialize(name, owner)
    # атрибуты класса "company"
    @name = name
    @owner = owner
  end  

  # методы "new_product"
  def new_product
    puts 'The new product is coming out!'
  end  

  # метод "describe"
  def describe
    puts "Hi, I'm #{@owner} and my company is #{@name}"
  end
end


Первое отличие — объявление атрибутов. В Ruby они находятся в конструкторе или в sets/gets (далее по тексту). И эти атрибуты объявляются знаком @ перед их именем, например @name. Объявление методов также очень простое: просто два ключевых слова «def» и «end».

После объявления класса им тут же можно воспользоваться.

# объявление класса из прошлого листинга
# ...
comp = Company.new('Free Cars', 'Ray')
comp.describe # Вывод: Hi, I'm Ray and my company is Free Cars 

# Ошибка...
puts comp.owner # Вывод: NoMethodError: undefined method ‘owner’


Результат выполнения скрипта:



Из примера можно сделать два вывода. Во-первых, нельзя обращаться к атрибутам без «getter». Другой важный момент, ошибка отобрадаеся после запуска программы (да, как в PHP, скрипт работает до его окончания или первой ошибки).

Gets/Sets в классах


Хорошая практика использовать методы доступа к данным (также известные как getters/setters). Язык здесь слегка помогает.

class Company
 attr_accessor :name # Set и Get в одну строку
 def initialize(name, owner)
    # attributes of Company's class
    @name = name
    @owner = owner
  end
end

comp = Company.new('Free Cars', 'Ray')
puts comp.name
comp.name = 'Old Cars'
puts comp.name


Результат:


С «attr_accessor» мы объявляем методы set/get для атрибута. Как правило, мы объявляем get/set для доступа к атрибутам, но это не значит, что нельзя создать полноценный метод.

Собираем все вместе


class Factory
	# Sets и Gets для всех атрибутов
	attr_accessor :name, :creation_year, :use_of_floors

	# Конструтор класса
	def initialize(name,creation_year,use_of_floors)
    	@name = name
    	@creation_year = creation_year
    	@use_of_floors = use_of_floors
   	end

	def description
	   puts "This factory is #{@name} and was created in #{@creation_year}"
	end

	def report_of_floors
		@use_of_floors.each_with_index do |element,index|
			puts "The floor number #{index} is used for #{element}"
		end
	end
end

a = Factory.new('Apple',1976,['Reception','Production','Offices'])

a.description
a.report_of_floors


Результат выполнения:



Заключение


Официальная документация обязательна к прочтению, до чего нельзя называться полноценными разработчиками.
  • +1

1 комментарий

avatar
  • MpaK
  • 0
Переводы конечно хорошо.

Ух, я бы как-то не стал рекомендовать так учиться в сравнении с другим языком, тем более с PHP.
Ruby совсем иной, даже ООП ближе я бы сказал к JavaScript'овскому и Python'у, декларативное.

И как-то автором не показаны все фишки и вкусности. Получается не видно резона переходить на Ruby, если всё тоже самое, что и на PHP. Может он допишет конечно и расскажет о вкусных итераторах, как легко расширяются классы, что Class это и есть объект, а Object это и есть класс, как вкусно можно подмешивать модули в классы получая миксины, какой удобный нэймспэйс у Ruby, что только в PHP с 5.3 появилось, про пакеты GEM тоже бы, как удобно поставить и какая куча этих библиотек… как бы мотивируя тем самым переход и «рост» PHP программистов.

Кстати, может кому интересно будет, продаю книги:
Фултон «Программирование на языке Ruby» 300 р.-
Максим Кузнецов, Игорь Симдянов «MySQL на примерах» 300 р.-
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.