10 сентября 2010
Ruby для PHP разработчиков
Перевод статьи: www.tuttoaster.com/ruby-for-php-developers/
Статья для новичков. В оригинале слишком много вау, которые я не стал переводить. Многие конструкции недостаточно полно описаны, но для этого есть официальное руководство.
Можно сказать, что PHP и Ruby (+фрейморк) наиболее используемые языки в интернете.
Чтобы установить Ruby надо выполнить следующие шаги:
Ruby динамический язык, как и PHP, таким образом не нужно объявлять переменные перед их использованием. Разница здесь в типах — Ruby строго типизированный язык, так что если мы хотим конвертировать число в строку, мы должны вызвать соответствующую функцию. Посмотрим на парочку примеров работы с переменными в PHP и Ruby.
Эти скрипты имеют одну задачу: присоединить число к строке и вывести результат. Вот и первые отличия от PHP:
Посмотрим на первый шаг использование массивов — создание и доступ к их элементам. Отсчет элементов начинается с нуля.
Результат выполнения:

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

Посмотрим на другие циклы. Здесь «while» со счетчиком:
В PHP нет «until», а в Ruby есть.
Посмотрим на отличия:

Оба цикла выполнились одинаковое количество раз. Конструкция «for» в Ruby такая же как в PHP, но синтаксис несколько чище.
Другой цикл целиком в духе Ruby. Мы просто говорим сколько раз нам надо выполнить что-нибудь:
Ruby как и PHP — объектно-ориентированные языки. Это значит что здесь есть классы, методы и атрибуты. Посмотрим на класс.
Первое отличие — объявление атрибутов. В Ruby они находятся в конструкторе или в sets/gets (далее по тексту). И эти атрибуты объявляются знаком @ перед их именем, например @name. Объявление методов также очень простое: просто два ключевых слова «def» и «end».
После объявления класса им тут же можно воспользоваться.
Результат выполнения скрипта:

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

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

Официальная документация обязательна к прочтению, до чего нельзя называться полноценными разработчиками.
Статья для новичков. В оригинале слишком много вау, которые я не стал переводить. Многие конструкции недостаточно полно описаны, но для этого есть официальное руководство.
- Переменные.
- Массивы.
- Логика, циклы и функции.
- Классы.
Краткое введение
Можно сказать, что PHP и Ruby (+фрейморк) наиболее используемые языки в интернете.
Чтобы установить Ruby надо выполнить следующие шаги:
- Windows: Скачать пакет с официального сайта.
- Mac OS X: Предустановлен.
- Linux (вероятно, Ubuntu): Просто написать: «sudo apt-get install ruby-full».
- Другая ОС: Сходить в раздел загрузок на официальном сайте.
Переменные
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Результат выполнения:

Заключение
Официальная документация обязательна к прочтению, до чего нельзя называться полноценными разработчиками.
- MpaK
- 11 сентября 2010, 10:11
- 0
Переводы конечно хорошо.
Ух, я бы как-то не стал рекомендовать так учиться в сравнении с другим языком, тем более с PHP.
Ruby совсем иной, даже ООП ближе я бы сказал к JavaScript'овскому и Python'у, декларативное.
И как-то автором не показаны все фишки и вкусности. Получается не видно резона переходить на Ruby, если всё тоже самое, что и на PHP. Может он допишет конечно и расскажет о вкусных итераторах, как легко расширяются классы, что Class это и есть объект, а Object это и есть класс, как вкусно можно подмешивать модули в классы получая миксины, какой удобный нэймспэйс у Ruby, что только в PHP с 5.3 появилось, про пакеты GEM тоже бы, как удобно поставить и какая куча этих библиотек… как бы мотивируя тем самым переход и «рост» PHP программистов.
Кстати, может кому интересно будет, продаю книги:
Фултон «Программирование на языке Ruby» 300 р.-
Максим Кузнецов, Игорь Симдянов «MySQL на примерах» 300 р.-
Ух, я бы как-то не стал рекомендовать так учиться в сравнении с другим языком, тем более с PHP.
Ruby совсем иной, даже ООП ближе я бы сказал к JavaScript'овскому и Python'у, декларативное.
И как-то автором не показаны все фишки и вкусности. Получается не видно резона переходить на Ruby, если всё тоже самое, что и на PHP. Может он допишет конечно и расскажет о вкусных итераторах, как легко расширяются классы, что Class это и есть объект, а Object это и есть класс, как вкусно можно подмешивать модули в классы получая миксины, какой удобный нэймспэйс у Ruby, что только в PHP с 5.3 появилось, про пакеты GEM тоже бы, как удобно поставить и какая куча этих библиотек… как бы мотивируя тем самым переход и «рост» PHP программистов.
Кстати, может кому интересно будет, продаю книги:
Фултон «Программирование на языке Ruby» 300 р.-
Максим Кузнецов, Игорь Симдянов «MySQL на примерах» 300 р.-
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Комментарии:1