Skip to content

Commit

Permalink
Merge branch 'master' into patch-12
Browse files Browse the repository at this point in the history
  • Loading branch information
Svet-Svet authored Jan 15, 2021
2 parents 109ec81 + a53b8e1 commit bf24b1d
Show file tree
Hide file tree
Showing 149 changed files with 1,606 additions and 449 deletions.
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ RUN apt-get install -y ruby-full bundler
WORKDIR /exercises-ruby

COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock

RUN bundle install

Expand Down
26 changes: 13 additions & 13 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (6.1.0)
activesupport (6.1.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
Expand All @@ -13,10 +13,10 @@ GEM
byebug (11.1.3)
coderay (1.1.3)
concurrent-ruby (1.1.7)
i18n (1.8.5)
i18n (1.8.7)
concurrent-ruby (~> 1.0)
method_source (1.0.0)
minitest (5.14.2)
minitest (5.14.3)
minitest-power_assert (0.3.1)
minitest
power_assert (>= 1.1)
Expand All @@ -26,7 +26,7 @@ GEM
minitest (>= 5.0)
ruby-progressbar
parallel (1.20.1)
parser (2.7.2.0)
parser (3.0.0.0)
ast (~> 2.4.1)
power_assert (1.2.0)
pry (0.13.1)
Expand All @@ -36,25 +36,25 @@ GEM
byebug (~> 11.0)
pry (~> 0.13.0)
rainbow (3.0.0)
regexp_parser (2.0.0)
regexp_parser (2.0.3)
rexml (3.2.4)
rubocop (1.6.1)
rubocop (1.8.1)
parallel (~> 1.10)
parser (>= 2.7.1.5)
parser (>= 3.0.0.0)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.8, < 3.0)
rexml
rubocop-ast (>= 1.2.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 2.0)
rubocop-ast (1.3.0)
unicode-display_width (>= 1.4.0, < 3.0)
rubocop-ast (1.4.0)
parser (>= 2.7.1.5)
rubocop-minitest (0.10.1)
rubocop (>= 0.87)
ruby-progressbar (1.10.1)
rubocop-minitest (0.10.2)
rubocop (>= 0.87, < 2.0)
ruby-progressbar (1.11.0)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
unicode-display_width (1.7.0)
unicode-display_width (2.0.0)
zeitwerk (2.4.2)

PLATFORMS
Expand Down
2 changes: 1 addition & 1 deletion modules/10-basics/10-hello-world/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

describe 'output' do
it 'should works' do
_(-> { require './index' }).must_output(/Hello, World!/)
_(-> { require_relative './index' }).must_output(/Hello, World!/)
puts 'Hello, World!'
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,18 @@ theory: |
## В чём соль?
Ruby — динамический строго типизированный язык с глубоким уклоном в объектно-ориентированную и функциональную парадигму программирования. Он обладает местами непривычным, но невероятно выразительным синтаксисом. Благодаря этому код на Ruby читается как английский язык и при этом остается компактным:
Ruby — динамический, строго типизированный язык с глубоким уклоном в объектно-ориентированную и функциональную парадигму программирования.
```ruby
# Строгая типизация, число нельзя умножить на строку
4 * 'hexlet' # TypeError (String can't be coerced into Integer)
# Все объекты
1.8.round # 2
# функции высшего порядка
['one', 'two'].map(&:upcase) # ["ONE", "TWO"]
```
Он обладает местами непривычным, но невероятно выразительным синтаксисом. Благодаря этому код на Ruby читается как английский язык и при этом остается компактным:
```ruby
# Определение конечного автомата
Expand Down
2 changes: 1 addition & 1 deletion modules/10-basics/15-ruby-as-a-second-language/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
it 'should works' do
date = 1.day.ago - 1.week + 3.hours
r = Regexp.new(date.year.to_s, Regexp::MULTILINE)
_(-> { require './index' }).must_output(r)
_(-> { require_relative './index' }).must_output(r)
puts date
end
end
40 changes: 14 additions & 26 deletions modules/10-basics/20-everything-is-object/description.ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,9 @@ theory: |
Ruby по своим возможностям и подходам в разработке близок к JavaScript и Python, но имеет свои особенности. Разработчики языка во многом опирались на Smalltalk, Lisp (это семейство языков), Perl и другие подобные языки. Это привело к интересному результату. Во-первых, Ruby — **очень** объектно-ориентированный язык. В Ruby всё есть объект, включая `nil` (это аналог `null`), и каждая операция — это вызов метода:
```ruby
1.positive? # true
1.zero? # null
'hexlet'.reverse # telxeh
1.7.round # 2
nil.to_i # 0
# проверяем, что у объекта есть метод to_s
true.respond_to?(:to_s) # true
1 + 1 # на самом деле 1.+(1)
```
Expand Down Expand Up @@ -39,31 +37,11 @@ theory: |
```ruby
# Кажется, что это прямое изменение свойства
# На самом деле это сеттер
# На самом деле это сеттер object.key=('value')
obj.key = 'value'
```
В Ruby, в отличии от большинства других языков, принято использовать предикаты практически для всех часто встречающихся проверок. Например, как мы обычно проверяем, что число равно нулю? С помощью сравнения с нулем. В Ruby это тоже работает, но это не Ruby way:
```ruby
0.zero? # true
1.zero? # false
2.positive? # true
# чётное/нечётное
8.even? # true
8.odd? # false
''.empty? # true
'wow'.empty? # false
# не пустой массив
items.any?
# пустой массив
items.empty?
```
Все данные в Ruby — это объекты, или, как говорят, инстансы классов. Для каждого типа у Ruby свой класс. `nil`, например, представлен классом `NilClass`, и является единственным его объектом. `true` — объект класса `TrueClass`, а `false` — объект класса `FalseClass`.
Все данные в Ruby — это объекты. Например `nil`, например, представлен классом `NilClass`, и является единственным его объектом. `true` — объект класса `TrueClass`, а `false` — объект класса `FalseClass`. У остальных типов свои классы.
Узнать класс любого объекта можно так:
Expand All @@ -75,6 +53,16 @@ theory: |
С другой стороны, классы в Ruby — тоже объекты, у которых есть свои классы 0_o. Но это уже совсем другая история) Есть даже такая шутка (но это не шутка): в Ruby объект это класс, а класс — это объект. Почему это так – узнаем чуть позже.
## Отладочная печать
Иногда в работе приходится прибегать к отладочной печати и в Ruby есть несколько особенностей, о которых надо знать. Функция `put()` выводит любые типы данных без необходимости преобразования их в строку. С другой стороны, такой вывод не останавливает выполнение и иногда это неудобно, если хочется посмотреть только первый вывод. Для таких ситуаций лучше использовать выброс исключения, которое и выведет на экран нужную информацию и прервет выполнение. Делается это так:
```ruby
# raise – бросить исключение
# .inspect – метод, который преобразует любые данные в строковое представление
raise something.inspect
```
instructions: |
Напечатайте на экран следующий вызов:
Expand Down
2 changes: 1 addition & 1 deletion modules/10-basics/20-everything-is-object/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

describe 'function' do
it 'should works' do
_(-> { require './index' }).must_output(/respond_to/)
_(-> { require_relative './index' }).must_output(/respond_to/)
puts 'hexlet'.methods.grep(/\?/)
end
end
2 changes: 1 addition & 1 deletion modules/10-basics/25-first-function/test.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# frozen_string_literal: true

require 'test_helper'
require './index'
require_relative './index'

describe 'function' do
it 'should works' do
Expand Down
File renamed without changes.
73 changes: 73 additions & 0 deletions modules/10-basics/27-conditions/description.ru.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---

name: Логический тип
theory: |
## Логические операторы
Логический тип в Ruby представлен привычными значениями `true` и `false`, а так же набором операторов `&&` (и), `==` (равно), `||` (или) и `!` (не):
```ruby
true && false # false
fales || true # true
```
В отличии от многих других языков, сравнение с логическим значением в Ruby строгое, то есть `true` и `false` равны только самим себе:
```ruby
true == 1 # false
false == nil # false
```
Что не отменяет возможности использовать в логических выражениях значения любых типов:
```ruby
0 && 'one' # "one"
nil && false # nil
```
В Ruby только `nil` и `false` рассматриваются как *falsey*, все остальные значения в логических выражениях приводятся к `true`.
## Значение по умолчанию
В Ruby широко используется такой код:
a ||= 'что-то'
# a = a || 'что-то'
Он используется для задания значения по умолчанию. Такое возможно и, почти всегда безопасно, из-за очень ограниченного списка *falsey* значений. Единственное место где этот способ не сработает – там где `false` это допустимое значение.
## Предикаты
В Ruby, в отличии от большинства других языков, принято использовать предикаты практически для всех часто встречающихся проверок. Например, как мы обычно проверяем, что число равно нулю? С помощью сравнения с нулем. В Ruby это тоже работает, но это не Ruby way:
```ruby
0.zero? # true
1.zero? # false
2.positive? # true
# чётное/нечётное
8.even? # true
8.odd? # false
''.empty? # true
'wow'.empty? # false
something.nil?
# не пустой массив
items.any?
# пустой массив
items.empty?
```
instructions: |
Реализуйте функцию, которая проверяет является ли переданное число четным. Не используйте встроенные функции для определения четности:
```ruby
even?(5) # false
even?(6) # true
```
tips: []
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# frozen_string_literal: true

# BEGIN
def even?(a)
(a % 2).zero?
end
# END
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# frozen_string_literal: true

require 'test_helper'
require './index'
require_relative './index'

describe 'function' do
it 'should works' do
# assert { double(3) == 6 }
assert { !even?(1) }
assert { even?(2) }
assert { !even?(9) }
end
end
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# frozen_string_literal: true

require 'test_helper'
require './index'
require_relative './index'

describe 'function' do
it 'should works' do
Expand Down
File renamed without changes.
64 changes: 64 additions & 0 deletions modules/10-basics/33-if-extra/description.ru.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
---

name: Условные конструкции (альтернативные варианты)
theory: |
Ruby поддерживает множество видов условных конструкций, которые иногда способны сделать код чуть проще и прямолинейнее. Все они встречаются в реальном коде регулярно.
## Тернарный оператор
Работает и выглядит аналогично другим языкам:
```ruby
# <expr1> ? <expr2> : <expr3>
v = 3 == 4 ? 1 : 0
```
## Постфиксный if
В Ruby иф может стоять не только в начале, но и в конце выражений:
```ruby
doSomething() if num.zero?
```
Подобную форму записи принято использовать тогда, когда все выражение помещается в одну строчку.
## Unless
В дополнение к *if*, в Ruby, есть конструкция *unless*, которая работает в обратную сторону:
```ruby
# Пока (если) something не zero?
unless something.zero?
# что-то делаем
end
```
*unless* позволяет избавляться от отрицаний, но с ним нужно быть осторожным. Если в предикате используется составное логическое выражение, то *unless* становится не читаемым:
```ruby
# Попробуйте осознать этот код
unless a && b
end
```
instructions: |
Реализуйте функцию `get_sentence_tone()`, которая принимает строку и определяет тон предложения. Если все символы в верхнем регистре, то это вопль — `'scream'`. В ином случае — нормальное предложение — `'general'`.
Примеры вызова:
```ruby
get_sentence_tone('Hello') # general
get_sentence_tone('WOW') # scream
```
Алгоритм:
1. Сгенерируйте строку в верхнем регистре на основе строки-аргумента с помощью метода `upcase`.
2. Сравните её с исходной строкой:
- Если строки равны, значит, строка-аргумент в верхнем регистре.
- В ином случае — строка-аргумент не в верхнем регистре.
tips: []
7 changes: 7 additions & 0 deletions modules/10-basics/33-if-extra/index.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

# BEGIN
def get_sentence_tone(sentence)
sentence.upcase == sentence ? 'scream' : 'general'
end
# END
12 changes: 12 additions & 0 deletions modules/10-basics/33-if-extra/test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

require 'test_helper'
require_relative './index'

describe 'function' do
it 'should works' do
assert { get_sentence_tone('WOW') == 'scream' }
assert { get_sentence_tone('WOw') == 'general' }
assert { get_sentence_tone('Hexlet') == 'general' }
end
end
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ theory: |
name.length # 4
```
Одна из самых классных возможсностей у строк – слайсы. С их помощью можно находить любую подстроку в строке. Слайс — тоже метод, но с дополнительным синтаксисом из квадратных скобок:
Одна из самых классных возможностей у строк – слайсы. С их помощью можно находить любую подстроку в строке. Слайс — тоже метод, но с дополнительным синтаксисом из квадратных скобок:
```ruby
name = 'ruby'
Expand Down
File renamed without changes.
Loading

0 comments on commit bf24b1d

Please sign in to comment.