-
Notifications
You must be signed in to change notification settings - Fork 43
Improve with lessons review #166
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
262e5b7
210c227
efcb8a6
b69cb24
404b294
da31fee
041027f
0eed397
df86798
d20d021
9ade907
54e4fa8
7e3e262
508b941
b7ebd2f
288934b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# EditorConfig is awesome: https://EditorConfig.org | ||
|
||
# top-most EditorConfig file | ||
root = true | ||
|
||
[*] | ||
indent_style = space | ||
indent_size = 2 | ||
end_of_line = lf | ||
charset = utf-8 | ||
trim_trailing_whitespace = true | ||
insert_final_newline = true | ||
|
||
[Makefile] | ||
indent_style = tab | ||
|
||
[*.md] | ||
indent_size = 4 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
*.log | ||
tmp |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,25 @@ | ||
Наберите в редакторе код, чтобы программа вывела **точно такую строку**: | ||
|
||
Наберите в редакторе код из задания символ в символ и нажмите «Проверить». | ||
|
||
```ruby | ||
puts 'Hello, World!' | ||
```text | ||
Hello, World! | ||
``` | ||
|
||
### Важно! | ||
|
||
* Строка должна совпадать **символ в символ**: заглавные и строчные буквы, запятые, пробелы и восклицательный знак. | ||
* Кавычки обязательны. | ||
* Скобки у `puts` можно ставить или нет — это не повлияет на результат. | ||
|
||
### Типичные ошибки | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Убираем, курс не для новичков |
||
|
||
* `hello, World!` — первая буква маленькая | ||
* `Hello, world!` — буква "w" маленькая | ||
* `Hello World!` — пропущена запятая | ||
* `puts Hello, World!` — забыты кавычки | ||
* `puts(‘Hello, World!’)` — неправильные кавычки | ||
|
||
### Если тест не пройден | ||
|
||
1. Сравните вывод вашей программы с образцом `Hello, World!`. | ||
2. Исправьте отличия **символ в символ**. | ||
3. Запустите проверку снова. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,18 @@ | ||
|
||
На данном этапе мы знаем ещё слишком мало, чтобы писать какой-то интересный код, поэтому просто скопируйте и выполните код ниже. В этом коде используется библиотека ActiveSupport, которая расширяет язык некоторыми полезными возможностями. Изначально она была создана для Rails, но используется и за его пределами. | ||
На данном этапе мы знаем ещё слишком мало, чтобы писать какой-то интересный код, поэтому просто скопируйте и выполните код ниже. В этом коде используется библиотека ActiveSupport, которая расширяет язык некоторыми полезными возможностями.Изначально она была создана для Rails, но используется и за его пределами. | ||
|
||
Библиотека ActiveSupport уже подключена в файл, поэтому просто наберите код: | ||
|
||
```ruby | ||
# На сервере время в UTC | ||
# Считаться будет от него | ||
puts 1.day.ago - 1.week + 3.hours | ||
``` | ||
|
||
Код должен нужно набрать между специальными комментариями: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. код должен нужно |
||
|
||
```text | ||
# BEGIN (write your solution here) | ||
... тут пишем код | ||
# END | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1 @@ | ||
# BEGIN | ||
puts 'hexlet'.methods.grep(/\?/) | ||
# END | ||
puts 'hexlet'.methods.shuffle.first(5) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,23 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'active_support/all' | ||
require 'test_helper' | ||
|
||
describe 'function' do | ||
describe 'output' do | ||
it 'should works' do | ||
_(-> { require_relative 'index' }).must_output(/respond_to/) | ||
puts 'hexlet'.methods.grep(/\?/) | ||
# Захватываем stdout из index.rb | ||
out, _err = capture_io do | ||
require_relative 'index' | ||
end | ||
|
||
puts out | ||
|
||
methods = out.strip.split("\n") | ||
|
||
assert { methods.size == 5 } | ||
|
||
methods.each do |method| | ||
assert { "hexlet".respond_to? method } | ||
end | ||
end | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,3 @@ | ||
# frozen_string_literal: true | ||
|
||
# BEGIN | ||
def double(num) | ||
num * 2 | ||
end | ||
# END |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,11 @@ | ||
|
||
Реализуйте функцию `double()`, которая удваивает любое переданное ей число и возвращает его: | ||
Создайте функцию `double()`, которая удваивает любое переданное ей число и возвращает его. | ||
|
||
Пример вызова: | ||
|
||
```ruby | ||
double(3) # 6 | ||
double(8) # 16 | ||
``` | ||
|
||
Функцию не нужно вызывать вручную, она будет вызвана в тестах. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,22 @@ | ||
|
||
Начнем сразу с комплексного примера, включающего в себя определение функции, переменной и простые арифметические операции. Посмотрим на синтаксис и разберём некоторые интересные особенности Ruby. Ниже дано определение функции, находящей среднее арифметическое: | ||
В Ruby функция выглядит так: | ||
|
||
```ruby | ||
# Определение функции | ||
def имя_функции(параметр) | ||
# тело функции | ||
end | ||
|
||
# Вызов функции | ||
имя_функции(значение) | ||
``` | ||
|
||
* `def` — ключевое слово для создания функции | ||
* `имя_функции` — название функции (используем `snake_case`) | ||
* `(параметр)` — имя переменной, которая будет использоваться внутри функции | ||
* `end` — завершает функцию | ||
|
||
Ниже дано определение функции, находящей среднее арифметическое: | ||
|
||
```ruby | ||
# def – определение функции | ||
|
@@ -21,6 +38,8 @@ find_average 1, 2 | |
find_average(1) | ||
``` | ||
|
||
## Стиль кода в Ruby | ||
|
||
Сначала пара слов о стиле. В Ruby существует ровно один общепринятый стиль оформления кода, которого [придерживается](https://ukupat.github.io/tabs-or-spaces/) все комьюнити: | ||
|
||
* Отступы — два пробела | ||
|
@@ -43,3 +62,30 @@ sum = a + b | |
``` | ||
|
||
По своему смыслу функция `find_average()` должна возвращать число с плавающей точкой, поэтому такое преобразование необходимо. | ||
|
||
## Где проверить код | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Про репл как в python рассказываем |
||
|
||
Если у вас установлен Ruby, то можно запустить код внутри REPL, набрав в терминале команду `irb`: | ||
|
||
```bash | ||
irb | ||
irb(main):001* def find_average(a, b) | ||
irb(main):002* sum = a + b | ||
irb(main):003* sum.to_f / 2 | ||
irb(main):004> end | ||
=> :find_average | ||
irb(main):005> | ||
irb(main):005> find_average(1, 5) | ||
=> 3.0 | ||
irb(main):006> | ||
``` | ||
|
||
Или онлайн в [Repl.it Ruby](https://replit.com/languages/ruby). | ||
|
||
## Итог | ||
|
||
* Функции в Ruby определяются через `def ... end` | ||
* Имя функции пишется в стиле `snake_case` | ||
* Аргументы перечисляются в круглых скобках | ||
* `return` писать не обязательно — функция возвращает результат последнего выражения | ||
* Функции можно запускать как с круглыми скобками, так и без |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,11 @@ | ||
Реализуйте функцию предикат `even?`, которая проверяет, является ли переданное число чётным. Функция должна возвращать `true`, если число чётное и `false`, если не чётное. | ||
|
||
Реализуйте функцию предикат `even?`, которая проверяет, является ли переданное число чётным. Функция должна возвращать `true`, если число чётное и `false`, если не чётное. Не используйте встроенные функции для определения четности: | ||
В этом задании мы учимся работать с условиями, поэтому не используйте встроенные функции для определения четности. | ||
|
||
Примеры вызова: | ||
|
||
```ruby | ||
even?(5) # false | ||
even?(6) # true | ||
# Скобки при вызове можно опустить | ||
even? 6 # true | ||
``` |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,6 +24,16 @@ nil && false # nil | |
|
||
В Ruby только `nil` и `false` рассматриваются как *falsey*, все остальные значения в логических выражениях приводятся к `true`. | ||
|
||
## Spaceship-оператор | ||
|
||
Этот оператор удобно использовать в функциях сортировки для определения того, нужно менять местами два соседних элемента или нет. Всего у функции возможны три разных варианта возврата: | ||
|
||
```ruby | ||
1 <=> 1 # 0 числа равны | ||
2 <=> 1 # 1 левое больше правого | ||
1 <=> 2 # -1 левое меньше правого | ||
``` | ||
|
||
## Значение по умолчанию | ||
|
||
В Ruby широко используется такой код: | ||
|
@@ -58,3 +68,45 @@ items.any? | |
# пустой массив | ||
items.empty? | ||
``` | ||
|
||
Пример: функция, которая проверяет, что число положительное: | ||
|
||
```ruby | ||
def positive?(num) | ||
num > 0 | ||
end | ||
|
||
positive?(3) # true | ||
positive?(-1) # false | ||
``` | ||
|
||
**Правила:** | ||
|
||
* Название метода должно заканчиваться на `?` | ||
* Метод возвращает `true` или `false` | ||
* Параметры могут быть любыми объектами | ||
|
||
|
||
## Типичные ошибки | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Нужно убрать |
||
|
||
```ruby | ||
# ❌ Не используем ? в имени | ||
def even_length(str) | ||
str.length.even? | ||
end | ||
|
||
# ❌ Возвращаем не логическое значение | ||
def even_length?(str) | ||
str.length | ||
end | ||
``` | ||
|
||
## Итог | ||
|
||
* Логические значения в Ruby: `true` и `false` | ||
* Логические операторы: `&&` (и), `||` (или), `!` (не) | ||
* В Ruby только `nil` и `false` — falsey, остальные значения считаются true | ||
* Значение по умолчанию можно задавать через `||=` | ||
* Предикаты — методы, которые возвращают `true` или `false` | ||
* Методы-предикаты по соглашению заканчиваются на `?` | ||
* Можно создавать свои предикаты для любых проверок |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нужно объяснять в теории (я как раз в python делал)