Особенности языка ruby

Особенности языка ruby
Основные особенности языка ruby. Конструкции и синтаксис.

После весьма продолжительного по многим причинам перерыва, продолжаю наполнять статьями свою копилку знаний в интернетах. За это время я успел познакомится с языком программирования ruby, получить некоторое количество опыта работы с ruby on rails фреймворком и ... все забыть! Ну или почти забыть).

По этой причине я решил написать некоторое количество статей-шпаргалок, чтобы если что можно было открыть и быстро все вспомнить. И конечно же эти статьи могут оказатся полезными начинающим читателям-рубистам. А может даже и неначинающим. Но по крайней мере надеюсь что не заканчивающим.

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

В ruby все числа, строки, массивы, регулярные выражения и многие другие сущности фактически являются объектами (привет javascript)​
 
В ruby есть стандарты при которых методы с восклицательным(!) знаком в конце названия (так называемый «опасный» метод) изменяют объект а методы с вопросительным(?) знаком на конце (так называемые предикаты) возвращают булевное значение true или false
print "a is empty!" if a.empty?
name = "ivan"
name.capitalize!
print name                               #=> Ivan
Предложения return в конце метода можно опускать. Метод всегда возвращает значения последнего вычисленного выражения. В каком бы месте этого не происходило. 
def sum(a,b)
 a + b
end

c  = sum(5,2)                              #c равно 7
Аналог ассоциативного массива называется в руби "хешем" (или словарем). Так как он тоже является объектом то имеет много полезных методов.
grades = { "Jane Doe" => 10, "Jim Doe" => 6 }
options = { :font_size => 10, :font_family => "Arial" }    #символы в качестве ключей
options = { font_size: 10, font_family: "Arial" }          #альтернативный синтаксис примера выше
Скобки в методе можно опустить. Также можно опустить {} скобки при передачи хеша в метод.
def foo a, b, options = {}
 puts "#{a}"
 puts "#{b}"
 puts "#{options}" 
end
                                                       #=>  5
foo 5, "Ivan", font_size: 10, font_family: "Arial"     #=>  Ivan
                                                       #=>  {:font_size=>10, :font_family=>"Arial"}
Имена переменных не всегда можно отличить от имен методов. Правило такое: если анализатор видит что идентификатору присваивается значения до его использования то он считается переменной. В противном случае это имя метода.    
 
Сами по себе переменные в Ruby не имеют типа и не являются объектами, они лишь ссылаются на объект (есть исключения)
str = "Hello world!"
str2 = str
str.downcase!                #=> "hello world!"
str2                         #=> "hello world!"
Символ. Символы отличаются от строк тем что перменные содержащие символы с одним и тем же именем всегда ссылаются на один объект, тогда как переменные содержащие одинаковые строки ссылаются на разные объекты. Это позволяет экономить память, поэтому символы часто используются в качестве ключей к хешам и не только.
s1 = "abc"
s2 = "abc"
s1.object_id == s2.object_id # false
s1 = :abc
s2 = :abc 
s1.object_id == s2.object_id # true
Диапазоны. Объект класса range. Один из стандартных типов данных. Удобен для получения подмассива или подстроки. Также используется в итераторах. Пример:
"a".."z"                    #от a до z
1..10                       #от 1 до 10 включительно 
1...10                      #от 1 до 10 исключая 1 и 10.
 Многие управляющие конструкции возвращают значения. В частности if, unless и case.
a = 5
x = if a < 8 then 6 else 7 end # x равно 6
Модули. Модули в Руби похожи на классы. Они содержат набор методов, константы, другие модули и определения классов. В отличие от классов создать объекты на основе модуля нельзя, модуль не может иметь подклассы. Могут служить для централизованого хранения констант и методов. Также может использоватся в качестве примеси, при включении (include) модуля в класс, его методы добавляются в класс. Таким образом можно получить преимущества множественного наследования. Множественного наследования как такового в руби нет.
module MyModule
	def greet(name)
		return "Hello #{name}!"
	end
end

class MyClass
	include MyModule
end

obj = MyClass.new
obj.greet("Ivan")	        #=> "Hello Ivan!"
Синглетные методы, синглетные классы. Синглетные методы это методы которые принадлжеат одному-единственному объекту. Позволяют создать систему наследования на основе прототипирования (как в javascript). Синглетный класс в руби, подобная классу сущность методы которой хранятся на уровне объекта а не класса.
str = "hello"
class << str    
	def hyphenated  
		self.split("").join("-")
	end
end
str.hyphenated #=> "h-e-l-l-o"
Блоки и объекты proc. Блок — это произвольный код, который можно передать любому методу в качестве неявного последнего аргумента. Proc это объект содержащий блок.
def caller someProc			#someProc объект Proc который передается методу caller
	someProc.call			#исполняет содерживое блока объекта proc
end

greet = Proc.new do			#Создаем новый объект Proc c именем greet
	print "Hello world!"    #Методу new передаем содержимое блока   
end

caller greet				#=> "Hello world!"

Комментарии

    Коментарий от: nikolay

    Дата: 30.05.2017, 20:03:12
  • #от 1 до 10 исключая 1 и 10.

    1...10 - от 1 до 9
    Ответить
Добавить комментарий